还是n皇后(位运算)

好题解:https://blog.csdn.net/qq_40828060/article/details/79364577

位运算的各种使用。

小范围手模一下最好了。

#include<bits/sdtc++.h> 
using namespace std;
char s[17];
int p[17];
int n;
int END;
int ans=0;
int lowbit(int t){
    return t&(-t);
}
void dfs(int hang,int left,int right,int h){//依次是  行状态,左对角线,右对角线,第h行
    if(END==hang){//全部放完////////////
        ans++;//方法数加一
        return;
    }
    int y,m;
    int cur= hang | left | right | p[h];//第h行的状态
    m= (~cur) & END;//取反    并除去高位的影响
    while(m){
        y=lowbit(m);
        m-=y;
        dfs(hang+y,(left+y)<<1,(y+right)>>1,h+1);
    }
}
int main(){
    cin>>n;//输入n
    cin.ignore();//吃掉回车 
    for(int i=0;i<n;i++){
        scanf("%s",s);//逐个输入字符
        for(int j=0;j<n;j++){
            if(s[j]=='.')//如果遇到障碍,
                p[i]|=(1<<(n-j-1));//将第(n-j-1)位标记为1 
        }
    }
    END=(1<<n)-1;//放完状态
    dfs(0,0,0,0);
    cout<<ans;
    return 0;
}

 

posted @ 2019-10-12 17:13  wilxx  阅读(197)  评论(0编辑  收藏  举报