这道题我弄了好几天。
实在过不了。。
能帮忙看看有什么问题吗?
#include<bits/stdc++.h>
using namespace std;
int a[100][100],n,b[100],total;//a代表棋盘,b储存
//a数组为1代表有棋,0代表没棋
bool judge(int x,int y){//判断坐标(x,y)能不能走
if(a[x][y]==1) return false;//有棋,排除
for(int i=1;i<=n;i++){
if(a[x][i]==1&&i!=y) return false;//同一行已经有棋,排除
if(a[i][y]==1&&i!=x) return false;//同一列已经有棋,排除
if(x-i>0&&y-i>0){//左上右下对角线有棋,排除
if(a[x-i][y-i]==1) return false;
}
if(x+i<=n&&y+i<=n){
if(a[x+i][y+i]==1) return false;
}
if(x-i>0&&y+i<=n){//右上左下对角线有棋,排除
if(a[x-i][y+i==1]) return false;
}
if(x+i<=n&&y-i>0){
if(a[x+i][y-i]==1) return false;
}
return true;//无以上情况,可以放棋
}
}
void search(int x){
for(int i=1;i<=n;i++){
if(total==3) return;//已经有三种方案了,结束
if(judge(x,i)&&x==n){//最后一行并且能走
a[x][i]=1;
b[x]=i;
for(int j=1;j<=n;j++){//输出b中储存一套方案
printf("%d ",b[j]);
}
b[x]=0;
a[x][i]=0;
printf("\n");
total++;//方案数+1
}
if(judge(x,i)&&x!=n){//非最后一行并且能走
a[x][i]=1;//放棋标记
b[x]=i;//保存方案
int xx=x+1;
search(xx);//搜下一行
a[x][i]=0;//回溯
b[x]=0;
}
}
}
int main(){
scanf("%d",&n);
search(1);//从第一行开始搜
return 0;
}