#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"); }
|