0
已解决
杜承俊
资深守护
资深守护
题目链接:https://ke.codingtang.com/#/problem/problemSub?id=6509
超时代码:
#include<bits/stdc++.h>
using namespace std;
char a[20][20];
int n,cnt;
bool b[30],c[30],d[30];
void dfs(int t){
if(t==n+1){
cnt++;
return;
}
for(int i=1;i<=n;i++){
if(a[t][i]=='*'&&!b[i]&&!c[t-i+n]&&!d[t+i]){
b[i]=true,c[t-i+n]=true,d[t+i]=true;
dfs(t+1);
b[i]=false,c[t-i+n]=false,d[t+i]=false;
}
}
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
dfs(1);
cout<<cnt;
}
0
已采纳
汪恺恒
中级启示者
中级启示者
这题要用位运算优化(
用二进制表示状态,1表示该点不能放(与其他位置的皇后排斥或初始状态就不能放),0表示该点可以放皇后
用vis数组来存储初始状态,将'.'的地方置为1
然后我就不会了
0
0
0
0
0
0