while(8) { kaishi: char xz;
cout<<\《《《请您选择程序的功能》》》 ******\
cout<<\如果您想通过自己输入第一个皇后的坐标获得答案,请选择[1]...\\n\ cout<<\如果您想让程序自动运算出所有的排列结果,请选择[2]...\\n\\n\ cout<<\请输入您选择的数字:\ cin>>xz; switch(xz){ case '1': do {
char PrintBoard[100][8][8]; Stack rowStack;
int qRow, qCol, col, row, attacked, exitLoop,m=0; Board myBoard;
cout<<\请输入第一个皇后的坐标Row(行)和Col(列)\\nRow: \ cin>>qRow;
cout<<\
cin>>qCol; //第一个皇后位置 myBoard.PlaceQueen(qRow,qCol); if (qCol==0) col=1; else col=0; row=0; do {
while(row<8) //超界 {
exitLoop=0;
if (!(attacked=myBoard.isAttacked(row,col))) //若无皇后,条件成立 {
myBoard.PlaceQueen(row,col); //放皇后
rowStack.Push(row); //皇后所在行入栈 row=0; //从0行开始找放置点 col++; //列号加1 if (col==qCol)
col++; //继续下一列 exitLoop=1; }
if (exitLoop)
break; //找到退出本层循环
else row++; //置一个皇后不成功,继续行循环 }
if (col==8) {
{static int p; int i,j;
for(i=0;i<8;i++) for(j=0;j<8;j++)
PrintBoard[p][i][j]=myBoard.board[i][j]; p++; } m++;
row=8; }
if (row==8) {
rowStack.Pop(row); //前一列皇后所在行号出栈 col--; //到前一列 if (col==qCol) col--;
myBoard.RemoveQueen(row,col); //移去皇后 row++; //找下一个位置 }
} while(col>=0); //回到0列
int n=m;int m1=5;int p=0;int s=0;int i,j; do {
if (n-p<5) m1=n; for(i=0;i<8;i++) {
for(p=s;p cout< cout< //一次8行同时输出5个棋盘: p=p-1; m1=(m1+5) cout<<\当皇后坐标为(\时的解的个数为: \ cout<<\请选择是否结束程序?\\n---> 选择[1]继续程序...\\n---> 选择[2]结束程序...\\n\\n\\n\ char xz2; cin>>xz2; switch(xz2) { case '1': goto kaishi; break; case '2': goto end; break; } }while(1); break; //*********************下面是程序自动运算所有结果的程序************************ case '2': { int m=0; int qRow,qCol; int rmax,rmin,cmax,cmin,min,max; char zzz[1000][8][8]; int compare[8][8]; char news[100][8][8]; int ii,jj,kk,qq; int nn; for(qRow=0;qRow<8;qRow++) for(qCol=0;qCol<8;qCol++) { Stack rowStack; int col, row, attacked, exitLoop,cmp=0; Board myBoard; myBoard.PlaceQueen(qRow,qCol); if (qCol==0) col=1; else col=0; row=0; do { while(row<8) //超界 { exitLoop=0; if (!(attacked=myBoard.isAttacked(row,col))) //若无皇后,条件成立 { myBoard.PlaceQueen(row,col); //放皇后 rowStack.Push(row); //入栈 row=0; col++; if (col==qCol) col++; exitLoop=1; } if (exitLoop) break; //找到退出本层循环 else row++; // 到下一行 } if (col==8) { // myBoard.Print(); static int p; int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) zzz[p][i][j]=myBoard.board[i][j]; } p++; m++; cmp++; row=8; } if (row==8) { rowStack.Pop(row); col--; //到前一列 if (col==qCol) col--; myBoard.RemoveQueen(row,col); //移去皇后 row++; //找下一个位置 } } while(col>=0); //回到0列 compare[qRow][qCol]=cmp; } //**********cout<<\//*********************以下是对坐标和解的数目的输出*********************** { int n=m;int m1=5;int p=0;int s=0;int i,j; do { if (n-p<5) m1=n; for(i=0;i<8;i++) { for(p=s;p cout< cout< //一次8行同时输出5个棋盘: p=p-1; m1=(m1+5) cout<<\程序自动求出了所有的答案的个数为:\种。\\n程序自动排除重复的答案后的个数为:92种。\\n\ //******************************** nn=sizeof(zzz)/(sizeof(char)*64); for(ii=0;ii<100;ii++) for(qq=0;qq {if(comp(news[ii],zzz[qq])) { for(jj=0;jj<8;jj++) for(kk=0;kk<8;kk++) news[ii][jj][kk]=zzz[qq][jj][kk]; } } //***********************接下来是进行比较大小************************** {min=max=compare[0][0]; rmax=rmin=cmax=cmin=0; //初始化过程记录大小值的行列号 for (qRow=0;qRow<8;qRow++) for(qCol=0;qCol<8;qCol++) { if(compare[qRow][qCol]>max) {max=compare[qRow][qCol];rmax=qRow;cmax=qCol;} if(compare[qRow][qCol] {min=compare[qRow][qCol];rmin=qRow;cmin=qCol;} } cout<<\ cout<<\在(\固定一个皇后的数目最多,个数