题目描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方
- 引入状态数组vis[8][8],vis[i][j]表示(i,j)被多少个皇后攻击
- 之所以不用0,1来表示(i,j)是否被攻击,是因为回溯时,拿走一个皇后,也要将它攻击的位置清除,但如果把他攻击的位置变成0,那别的皇后对这个位置的攻击可能也会失效
- 输出二维数组时,输出a[i][j]应改成a[j][i]
对于第3条,可以试一下
#include<bits/stdc++.h>
using namespace std;
int n=8;
int vis[8][8];
int a[8][8];
int ans=0;
void setVis(int i,int j,int f){
a[i][j]=(f==1);
vis[i][j]+=f;
for(int k=0;k<n;k++){
if(k!=j) vis[i][k]+=f;
}
for(int k=0;k<n;k++){
if(k!=i) vis[k][j]+=f;
}
for(int k1=i,k2=j;k1<n && k2>=0; k1++,k2--){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
for(int k1=i,k2=j;k1>=0 && k2<n; k1--,k2++){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
for(int k1=i,k2=j;k1>=0 && k2>=0; k1--,k2--){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
for(int k1=i,k2=j;k1<n && k2<n; k1++,k2++){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
}
void dfs(int i) {
if(i==n) {
cout<<"No. "<<++ans<<endl;
for(int j=0; j<n; j++) {
for(int k=0; k<n; k++) {
cout<<a[k][j]<<" ";
}
cout<<endl;
}
return;
}
for(int j=0;j<n;j++){
if(!vis[i][j]){
setVis(i,j,1);
dfs(i+1);
setVis(i,j,-1);
}
}
}
int main() {
dfs(0);
return 0;
}
标签:k2,int,问题,vis,k1,&&,皇后 From: https://www.cnblogs.com/algorithm-hu/p/18008603