#include <cmath>
#include <iostream>
#include <fstream>
using namespace std;

const int N=8; //默认为八皇后.
int count=0;
void Display(int * RowLoc,ostream &c)
  {
c<<"---------------"<< ++count <<"-------"<<endl;
for (int i=0;i<N;i++)
 {
for (int j=0;j<N;j++)
 {
c<< (RowLoc[i]==j ? " 1 ":" 0 ");
}
c<<endl;
}
c<<"------------------------------------"<<endl;
}

//核心函数,从那图(邻接矩阵)的深度遍历中体会到.Prim项目中,那找二点中最短路径的算法

void Queue(int * RowLoc,ostream & c,int nRow=0) //RowLoc保存每一行中,皇后所在的位置,下标从0开始. nRow表示将要填充第nRow+1行
  {
if (nRow==N) //填充到第八行了,结束.递归返回
 {
Display(RowLoc,c);
return;
}
for (int col =0;col<N;col++) //每一行从左到右填充,共N次
 {
//看第nRow行与它前面的几行是否有冲突
for (int RowBefore=0;RowBefore<nRow;RowBefore++)
 {
//当前要放点(nRow,col)与它前面行(RowBefore,RowLoc[RowBefore])皇后检测,
if (abs(col-RowLoc[RowBefore])==abs(nRow-RowBefore) || col==RowLoc[RowBefore])
goto nextcol; //不能放置在此.测试同行下一列的位置
}
RowLoc[nRow]=col; //当前行放置成功,开始填下一行
Queue(RowLoc,c,nRow+1);
nextcol:;
}
}

void main()
  {
 int temp[N]= {0};
ofstream f;
f.open("list.txt");
if (f.is_open())
 {
Queue(temp,cout);
Queue(temp,f);
cout<<"Succeed write data to \"list.txt\" file\n"<<endl;
}
f.close();
system("pause");
}

|