一般n皇后代码如下
输入n 输出方案个数
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=30;
int n,tot;//tot初始化
int vis[maxn][3];
int C[maxn];
void search(int cur){
if(cur==n) tot++;//不是n-1
else {
for(int i=0;i<n;i++)if(!vis[i][0]&&!vis[cur-i+n][1]&&!vis[cur+i][2]){
C[cur]=i;
vis[i][0]=vis[cur-i+n][1]=vis[cur+i][2]=1;
search(cur+1);
vis[i][0]=vis[cur-i+n][1]=vis[cur+i][2]=0;
}
}
}
int main(){
memset(vis,0,sizeof(vis));
memset(C,0,sizeof(C));
cin>>n;
tot=0;
search(0);
cout<<tot;
system("pause");
return 0;
}
题目描述:
国际象棋的棋盘可以看做是一个 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<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=30;
int n,tot;//tot初始化
int vis[maxn][3];
int C[maxn];
int f[maxn];//f把0到(剩余棋子个数-1)映射到还没有摆放棋子的行
int k=0;//k表示剩余棋子个数
void search(int c){//把cur换成c
if(c==k) tot++;//cur换成c n换为k
else {
int cur=f[c];//映射
for(int i=0;i<8;i++)if(!vis[i][0]&&!vis[cur-i+8][1]&&!vis[cur+i][2]){
C[cur]=i;
vis[i][0]=vis[cur-i+8][1]=vis[cur+i][2]=1;
search(c+1);//cur换成c
vis[i][0]=vis[cur-i+8][1]=vis[cur+i][2]=0;
}
}
}
int main(){
memset(vis,0,sizeof(vis));
memset(C,0,sizeof(C));
memset(f,0,sizeof(f));
tot=0;
int x;
for(int i=0;i<8;i++){
int flag=1;
for(int j=0;j<8;j++){
cin>>x;
if(x==1){
vis[j][0]=vis[i-j+8][1]=vis[i+j][2]=1;
flag=0;
}
}
if(flag) f[k++]=i;
}
search(0);
cout<<tot;
// system("pause");
return 0;
}