• poj 1321 棋盘问题(dfs)


    Description

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

    Input

    输入含有多组测试数据。 
    每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 
    当为-1 -1时表示输入结束。 
    随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 

    Output

    对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

    Sample Input

    2 1

    #.

    .#

    4 4

    ...#

    ..#.

    .#..

    #...

    -1 -1

    Sample Output

    2

    1

    思路:从第一层往下搜索 每次都记录当前层数即可 (只搜当前层以下)

    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    #include<iostream>  
    #include<string>  
    #include<vector>  
    #include<stack>  
    #include<bitset>  
    #include<cstdlib>  
    #include<cmath>  
    #include<set>  
    #include<list>  
    #include<deque>  
    #include<map>  
    #include<queue> 
    #define ll long long int
    using namespace std;
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
    int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
    const int inf=0x3f3f3f3f;
    const ll mod=1e9+7;
    int n,k,ans;
    char G[10][10];
    bool vis[10][10];
    bool jug(int x,int y){
        for(int i=1;i<=n;i++)
            if(vis[i][y]&&x!=i)
                return false;
        for(int i=1;i<=n;i++)
            if(vis[x][i]&&y!=i)
                return false;
            return true;
    }
    void dfs(int s,int h){
        if(s==k){
            ans++;
            return ;
        }
        for(int i=h;i<=n;i++)
            for(int j=1;j<=n;j++){
                if(G[i][j]=='#'&&!vis[i][j]&&jug(i,j)){
                    vis[i][j]=1;
                    dfs(s+1,i+1);
                    vis[i][j]=0;
                }
            }
    }
    int main(){
        ios::sync_with_stdio(false);
        while(cin>>n>>k){
            if(n==-1&&k==-1) break;
            memset(vis,0,sizeof(vis));
            ans=0;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    cin>>G[i][j];
            dfs(0,1);
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Net框架下的XSLT转换技术简介
    ASP.NET单点登录(代码)
    IE直接下载汇总
    获取客户端网卡MAC地址和IP地址的几种方法(一)
    .NET专区用ASP.Net获取客户端网卡的MAC
    C#枚举系统安装的所有打印机
    Div+CSS布局入门教程
    动态加载JS脚本的4种方法
    WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息,所在城市
    股票中的名词解释
  • 原文地址:https://www.cnblogs.com/wmj6/p/10457246.html
Copyright © 2020-2023  润新知