GPT答: |
7i24.cn
|
) return 0; } for(i=0;row+i<8&&col-i>=0;i++)//判断左下 { if(chess[row+i][col-i]==1) return 0; } for(i=0;i<8;i++)//判断行 { if(chess[row][i]==1) return 0; } for(i=0;row-i>=0&&col+i<8;i++)//判断右上 { if(chess[row-i][col+i]==1) return 0; } for(i=0;row+i<8&&col+i<8;i++)//判断右下 { if(chess[row+i][col+i]==1) return 0; } return 1;//如果都没有返回,说明该位置安全 } void print(int(*chess)[8])//打印棋盘 { int i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a,b,c,d,e,f,g,h;//用于输出所有解法的计数器 printf("第%d种摆法:\n",++count); //每输出一次就将计数器加一,表示已经找到了一种解法 for (i = 7 ; i >= -1 ; --i)//从最后一行开始往上遍历 { if (i == -1)//如果已经遍历完了所有行 { printf("\n"); break;//跳出循环 } for (j = -2 ; j <9 ; ++j)//从最左边开始往右遍历 { if (j == -2 || j ==-1 || j==8 ) continue;//不输出棋子和边界 else if(j==7)//如果是该行的最后一个格子,则需要单独处理 printf("%d\n",chess[i][j]); else printf("%d ",chess[i][j]); } } return;//结束函数 } void queen(int row,int(*chess)[8]) //递归函数,用于放置皇后 { int i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a,b,c,d,e,f,g,h,flag=notdanger(row,3,chess);//flag为标志位,表示当前位置是否安全 if(row>7)//当放置完第八个皇后时直接打印结果并返回 print(chess); else {//否则继续向下搜索 for(j=3;j<=4;j+=2){//只在第四列和第六列尝试放置皇后 flag = notdanger(row,j,chess);//检查当前位置是否安全 if(flag){ chess[row][j]=1;//若当前位置安全,则将皇后放在此处 queen(row+1,chess);//递归调用queen函数,在下一行寻找合适的位置 chess[row][j]=0;//回溯操作,撤销对该点的选择 }//end of flag check }//end of column iteration }//end of row check return;}int main() {//主函数初始化棋盘,并调用queen函数求解答案。 int chess[8] [8]={ {2,2,2,9,2,9,9,9}, {9,-5,-5,-5,-5,-5,-5,-5}, {-6,-6,-6,-6,-6 ,-6 ,-6 ,-6 }, {-4 ,10 ,10 ,10 ,10 ,10 ,-3 ,-3 }, {-4 ,11 ,11 ,11 ,11 ,-3 ,-3 ,-3 }, {-4 ,12 ,'Q',12 ,'Q' ,'Q' ,'Q' ,'Q'}, {-4,'K',12,'B','N','R','-','-'}, {'-',-7,'-',-7,'-',-7,'-',-7}};/*这里使用数字代替各个棋子:*‘K’代表国王;*‘Q’代表皇后;*‘R’代表车;*‘B’代表象(即“相”);*‘N’代表马(即“日”);*-x表示黑方士兵或空格(没有棋子);*-X表示白方士兵或空格*/ printf("以下是所有可能的摆法:\n"); queen(4,ch ess);/*从第五排开始搜索*/ printf("共有%d种不同的摆法。\n",count); system("pause");return(666);}
|