(含详细注释)死活过不了样例,求助
查看原帖
(含详细注释)死活过不了样例,求助
836593
qiiie_yyy楼主2023/6/6 17:45

这道题我弄了好几天。

实在过不了。。

能帮忙看看有什么问题吗?

#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;
} 
2023/6/6 17:45
加载中...