TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
一般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[0]&&!vis[cur-i+n][1]&&!vis[cur+i][2]){
C[cur]=i;
vis[0]=vis[cur-i+n][1]=vis[cur+i][2]=1;
search(cur+1);
vis[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 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 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[0]&&!vis[cur-i+8][1]&&!vis[cur+i][2]){ C[cur]=i; vis[0]=vis[cur-i+8][1]=vis[cur+i][2]=1; search(c+1);//cur换成c vis[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;}
|
|