这道题有点难度
国际象棋的棋盘可以看做是一个 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 }
原文:https://www.cnblogs.com/zq-dmhy/p/11070167.html