问题标题: 酷町堂:6509 布阵

0
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
被禁言 张皓轩
张皓轩
中级光能
中级光能

1.数组定义大了

2.建议可以改变形参个数

3.代码要简化

0
0
杜承俊
杜承俊
资深守护
资深守护

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

0
杜承俊
杜承俊
资深守护
资深守护

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

0
杜承俊
杜承俊
资深守护
资深守护

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

0
我要回答