【c++搜索学习】1700:八皇后问题

161 阅读3分钟

本文已参与 ⌈新人创作礼⌋ 活动,一起开启掘金创作之路。 @TOC

题目如下:

描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。 输入 无输入。 输出 按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。 样例输入 样例输出 No. 1

1 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0

0 0 1 0 0 0 0 0

No. 2

1 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0

0 0 0 0 1 0 0 0

0 0 1 0 0 0 0 0

No. 3

1 0 0 0 0 0 0 0

0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 1

0 0 1 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 0 1 0 0 0 0

0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0

No. 4

1 0 0 0 0 0 0 0

0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1

0 0 0 0 0 1 0 0

0 0 1 0 0 0 0 0

0 0 0 0 0 0 1 0

0 1 0 0 0 0 0 0

0 0 0 1 0 0 0 0

No. 5

0 0 0 0 0 1 0 0

1 0 0 0 0 0 0 0

0 0 0 0 1 0 0 0

0 1 0 0 0 0 0 0

0 0 0 0 0 0 0 1

0 0 1 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 0 1 0 0 0 0

No. 6

0 0 0 1 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 1 0 0 0 0 0

0 0 0 0 0 1 0 0

No. 7

0 0 0 0 1 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1

0 0 0 1 0 0 0 0

0 1 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 1 0 0 0 0 0

0 0 0 0 0 1 0 0

No. 8

0 0 1 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0

No. 9

0 0 0 0 1 0 0 0

1 0 0 0 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0

0 0 0 0 0 0 1 0

0 0 1 0 0 0 0 0 ...以下省略

AC代码(代码写的有点乱0.0)

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int xx[10],yy[10],zz[10];
int m[10][10];
int sum=0;
bool cc(int x,int i){
	return (xx[i]||yy[x+i]||zz[x-i+10])==0;//判断是否可放
}
void tue(int x,int i,int f){
	m[x][i]=xx[i]=yy[x+i]=zz[x-i+10]=f;//放,并且记录数据

}
void print(){
	printf("No. %d\n",++sum);
	for(int i=1;i<=8;i++){
		for(int j=1;j<=8;j++){
			printf("%d ",m[j][i]);
		}
		cout<<endl;
	}
}
void a(int x){
	if(x>=9){//在此判断边界条件
		print();
		return ;
	}
	for(int i=1;i<=8;i++){
		if(cc(x,i)){
			tue(x,i,1);
			a(x+1);
			tue(x,i,0);//回溯数据搞成0
		}
	}
}
int main(){
		a(1);
}