八皇后问题(1220)

这道题有点难度

题目描述:

国际象棋的棋盘可以看做是一个 8 × 8 的矩阵,上面每一个格子仅能放一枚棋子,现在给出一个 8 × 8 的由 0 和 1 组成的矩阵,代表象棋棋盘,1 代表当前位置放置了一个皇后,0 则代表什么都没有放,上面有 n(n 为小于 8 的正整数)个位置已经放上了皇后棋子(相互之间不冲突,合理摆放),现在另外给你 8 - n 个皇后,问你有多少合理的摆法。

输入描述:

一个 8 × 8 的由 0 和 1 组成的矩阵。

输出描述:

一个整数,为摆放的种类数。

样例输入:

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

样例输出:

4

思想:

#include<iostream>
using namespace std;
int a[8],b[8]={0},c[16]={0},d[16]={0};
int num;
int swit(int i,int n){
	int j;
	if(i>n){
		num++;
	}
	else{
		for(j=1;j<=n;j++){
			if(b[j]==0&&c[j+1]==0&&d[n-j+i]==0){
				a[i]=j;
				b[j]=1;
				c[i+j-1]=1;
				d[n-j+i]=1;
				swit(i+1,n);
				b[j]=0;
				c[i+j]=0;
				d[n-j+1]=0;
			}
		}
	}
}
int main(){
	int m[8][8];
	int p,q,r=1;
	for(p=0;p<8;p++){
		for(q=0;q<8;q++){
			cin>>m[p][q];
		}
	}
	num=0;
	for(p=0;p<8;p++){
		for(q=0;q<8;q++){
			if(m[p][q]==1){
				b[p]=1;
				c[r+p-1]=1;
				d[8-p+r]=1;
				r=r+1;
			}
		}
	}
	cout<<r;
	swit(r,8);
	cout<<num;
	return 0;
}

  

升级版;

 1 #include<iostream>
 2 using namespace std;
 3 int v[50][3]={0},m[50]={0},p[50]={0};
 4 int n,k=0,solus=0;
 5 void sh(int c){
 6     if(c==k){
 7         solus++;
 8     }
 9     else {
10         int cur=p[c];
11         for(int i=0;i<8;i++){
12             if(!v[i][0]&&!v[cur-i+8][1]&&!v[cur+i][2]){
13                 m[cur]=i;
14                 v[i][0]=v[cur-i+8][1]=v[cur+i][2]=1;
15                 sh(c+1);
16                 v[i][0]=v[cur-i+8][1]=v[cur+i][2]=0;
17             }
18         }    
19     }
20 }
21 int main(){
22     int x,i,j;
23     for(i=0;i<8;i++){
24         int flag=1;
25         for(j=0;j<8;j++){
26             cin>>x;
27             if(x==1){
28                 v[j][0]=v[i-j+8][1]=v[i+j][2]=1;
29                 flag=0;
30             }
31         }
32         if(flag){
33             p[k++]=i;
34         }
35     }
36     sh(0);
37     cout<<solus;
38     return 0;
39 }

猜你喜欢

转载自www.cnblogs.com/zq-dmhy/p/11070167.html
今日推荐