/*
*?NQueen.cpp
*
*已創建?開:?2013 65438+2月23日
*作者:?橙黃
*/
//形參rowCurrent表示當前到達的行數。
# include & ltiostream & gt
# include & ltfstream & gt
# include & ltiomanip & gt
# include & ltstdlib.h & gt
使用?命名空間?std
布爾?Check(int?rowCurrent,int?* & ampn queen);?//判斷功能
作廢?打印(ofstream?& ampos,int?n,int?* & ampn queen);//打印功能
作廢?求解(int?rowCurrent,int?* & ampNQueen,int?n,int?& amp數數,?ofstream?& ampOS);?//N皇後問題處理函數,index的初始值壹般為0。
//判斷函數,如果水平或垂直方向或對角線上有沖突,則返回FALSE。
布爾?Check(int?rowCurrent,int?* & ampNQueen)
{
int?我?=?0;
而(我?& lt?行電流)
{
if(NQueen[i]?==?NQueen[rowCurrent]?||?(ABS(n queen[I]-n queen[row current])?==?abs(i-rowCurrent))?)
{
回歸?假的;
}
i++;
}
回歸?真實;
}
//將所有可能的結果輸出到文本文檔。
作廢?打印(ofstream?& ampos,int?n,int?* & ampNQueen)
{
os & lt& lt”壹個呼叫\ n”;
為了什麽?(int?我?=?0;我?& lt?n;i++)?{
for(int?j?=?0?;?j?& lt?n;?j++)
{
os & lt& lt(NQueen[i]==j?1:0);
os & lt& ltsetw(2);
}
os & lt& lt”\ n”;
}
os & lt& lt”\ n”;
}
//核心函數。遞歸求解N皇後問題,打到底就打印。
作廢?求解(int?rowCurrent,int?* & ampNQueen,int?n,int?& amp數數,?ofstream?& ampos)
{
if(rowCurrent?==?N)//當前行數觸底,即完成壹個矩陣,輸出。
{
Print(os,n,n queen);
count++;
}
for(int?我?=?0;我?& lt?n;?i++)
{
NQueen[rowCurrent]?=?我;?//第I行第I列,試試看。
if(Check(rowCurrent,NQueen))
{
Solve(rowCurrent+1,NQueen,n,count,OS);//移動到下壹行
}
}
}
int?主()
{
int?n;?//問題的規模
int?數數?=?0;?//解決方案計數
cout & lt& lt"請輸入問題的規模n "
CIN & gt;& gtn;
如果(n & lt4)
{
cerr & lt& lt“問題等級必須大於4”< & lt;endl
回歸?0;
}
int?*NQueen?=?新的?int[n];
ofstream?OS;
OS . open(" result . txt ");
Solve(0,NQueen,n,count,OS);
cout & lt& lt“問題的解決辦法已經有了”
OS . close();
回歸?0;
}