zoukankan      html  css  js  c++  java
  • poj-1321 棋盘问题

    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

        因为不会有多余的空白行或空白列,所以保证每行每列都有可以落子的棋盘区域。每行每列只能有一枚棋子,只需对行、列的状态进行标记,用一个数组 ss 来标记列的状态,当 ss[i] == 0 时,表示第 i 列没有棋子,反之,当 ss[i] == 1 时,表示第 i 列已存在一枚棋子。另一方面,将行作为 DFS 的一个参数,因此每一行有两种状态,一是落子,另一是不落子。如此一来就能解决行、列是否存在棋子的问题。

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    char pic[10][10];
    int ss[10] = {0};
    int times;
    int n, k;
    
    int main(void)
    {
        void dfs(int, int);
        
        while(cin >> n >> k)
        {
            if(n == -1 && k == -1)
                break;
            
            for(int i = 0; i < n; i++)
            {
                cin >> pic[i];
            }
        
            times = 0;
        
            dfs(0, 0);
        
            cout << times << endl;
        }
        return 0;
    }
    
    
    void dfs(int x, int t)
    {
        if(x > n)              //注意,这里不能用 x >= n 。因为当 x == n 时,可能在上个DFS里刚n-1行落子,需要判断 t == k?
            return;
        
        if(t == k)  
        {
            times++;
            return;
        }
        
        dfs(x+1, t);
        
        for(int i = 0; i < n; i++)
        {
            if(pic[x][i] == '#' && ss[i] == 0)
            {
                ss[i] = 1;
                dfs(x+1, t+1);
                ss[i] = 0;
            }
        }
        
    }
    



  • 相关阅读:
    HTML初识
    使用python操作Memcache、Redis、RabbitMQ、
    使用salt-cloud创建虚拟机
    运维堡垒机----Gateone
    ELK日志分析系统
    Python MySQL API
    浅谈Java中static作用--转
    oracle如何设置最大连接数
    转--oracle查看允许的最大连接数和当前连接数等信息
    oracle 查看未关闭连接
  • 原文地址:https://www.cnblogs.com/limyel/p/6579737.html
Copyright © 2011-2022 走看看