在N*N的格子中,放置N个皇后,要求每行每列必须有一个皇后,任意两个皇后不能在彼此45角度的斜对角位置,每个皇后可以看到所有其它的皇后。请输出放置的方案。
输入格式:一行一个整数,N,直至N=0
输出格式:如果有解,从第一行到第N行的顺序,输出皇后的列号(从1开始计数),列号之间有空格,如果有多种解,输出字典序最小的解;如果无解,输出“Impossible!!!”;每个有效的N的输出结果占据一个完整的行。
输入样例:
2
4
0
输出样例:
Impossible!!!
2 4 1 3
每个皇后可以看到所有其它的皇后,这句话是什么意思?最好写个输出样例
#include<stdio.h>
//#define MAXSIZE 20;
//int a[MAXSIZE][MAXSIZE]; //这种定义方式在Xcode中会报蜜汁错误:Unexpected ';' before ']'
int a[20][20];
int n;
int total;
int FindIndexOfOne(int row){ //找到第row行皇后的列数(从0开始计数)
for(int col=0;col<n;col++){
if(a[row][col]==1)return col;
}
return -1;
}
void PrintAns(){ //打印各行皇后的列数(从1开始计数)
int row;
for(row=0;row<n-1;row++){
printf("%d ",FindIndexOfOne(row)+1);
}
printf("%d)\n",FindIndexOfOne(row)+1);
}
int NoAttack(int row,int col){ //检测row行col列位置放置的皇后是否不会被攻击
for(int i=0-n;i<n;i++){
if(row+i>=0&&row+i<n&&col+i>=0&&col+i<n&&a[row+i][col+i]==1)return 0;
if(row+i>=0&&row+i<n&&a[row+i][col]==1)return 0;
if(row+i>=0&&row+i<n&&col-i>=0&&col-i<n&&a[row+i][col-i]==1)return 0;
if(col-i>=0&&col-i<n&&a[row][col-i]==1)return 0;
}
return 1;
}
void FindQueen(int row){ //算法核心
if(row>=n){ //递归边界,此时已经求出一种解
PrintAns();
total++;
}
else{
for(int col=0;col<n;col++){
if(NoAttack(row,col)==1){
a[row][col]=1;
FindQueen(row+1);
a[row][col]=0;
}
}
}
}
int main(){
total=0;
while(scanf("%d",&n)&&n){
FindQueen(0);
if(total==0) printf("Impossible!!!");
total=0;
}
return 0;
}
无法实现如果有多种解,输出字典序最小的解
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html