zoukankan      html  css  js  c++  java
  • n皇后问题<dfs>

    n皇后问题指的是:
    n*n的国际象棋棋盘上摆放n个皇后,使其不能互相攻击,
    即任意两个皇后都不能处于同一行、同一列或同一斜线上,
    问有多少种摆法。
    
    和一般n皇后问题不同的是,现在棋盘上有可能已经放了一个皇后了。
    你能求出有多少合法的方案吗?
    多组数据。
    第一行有两个数n和m,n<=13表示棋盘大小,m<=1表示棋盘上已经有m个皇后了。
    下面m行,每一行有两个数x、y(x,y< n)表示棋盘上x行y列已经有一个皇后了。

    思路:打表,然后参考紫书。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    int a[14]={0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712};//打表了哈
    int vis[3][30];
    int n,m,x,y,ans;
    using namespace std;
    void dfs(int cur)
    {
        if(cur==n){ans++;return;}
        else if(cur==x)
            dfs(cur+1);
        else
            for(int i=0;i<n;i++)
            {
                if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
                {
                    vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
                    dfs(cur+1);
                    vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
                }
            }
    }
    int main ()
    {
        while(~scanf("%d%d",&n,&m)){
            ans=0;
            memset(vis,0,sizeof(vis));
            if(!m)//打表
                printf("%d
    ",a[n]);
            else{
                scanf("%d%d",&x,&y);
                vis[0][y]=vis[1][x+y]=vis[2][x-y+n]=1;//x代表行,y代表列
                dfs(0);
                printf("%d
    ",ans);
            }
        }
        return 0;
    }


    想的太多,做的太少。
  • 相关阅读:
    CSUST 4005-你真的会!(分治思维+线段树)
    CSUST 4007-你真的会图论吗?(思维-三元环)
    CSUST 4002-你真的会字符串吗?(DP)
    Odoo下拉动作列表
    Odoo Shell
    Odoo report
    Odoo Web Service API
    Odoo启动过程
    Odoo10 变化
    Odoo10尝鲜:出勤登记
  • 原文地址:https://www.cnblogs.com/pealicx/p/6115650.html
Copyright © 2011-2022 走看看