• POJ 1321 棋盘问题


    POJ 1321 棋盘问题

    Time Limit: 1000MS    Memory Limit: 65536K

     

    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
    

     

    题解

      数据也不大,无脑DFS。

     

    代码 C++

     1 #include <cstdio>
     2 int n, k, data[100][2], id, opt;
     3 bool inY[10], inX[10];
     4 void DFS(int now, int len){
     5     if (len == k){ ++opt;  return; }
     6     if (now >= id) return;
     7     if (!(inY[data[now][0]] | inX[data[now][1]])){
     8         inY[data[now][0]] = inX[data[now][1]] = 1;
     9         DFS(now + 1, len + 1);
    10         inY[data[now][0]] = inX[data[now][1]] = 0;
    11     }
    12     DFS(now + 1, len);
    13 }
    14 int main(){
    15     int i, j;
    16     char rd[10];
    17     while (scanf("%d%d ", &n, &k), n + k > 0){
    18         opt = id = 0;
    19         for (i = 0; i < n; ++i){
    20             gets(rd);
    21             for (j = 0; j < n; ++j){
    22                 if (rd[j] == '#') data[id][0] = i, data[id][1] = j, ++id;
    23             }
    24         }
    25         DFS(0, 0);
    26         printf("%d
    ", opt);
    27     }
    28     return 0;
    29 }


     

  • 相关阅读:
    trie树
    基数排序
    CF724E Goods transportation 最小割 DP
    [CQOI2009]跳舞 网络流
    NOIP2018爆零记
    斜率优化
    CF311B Cats Transport 斜率优化DP
    逆元
    卡特兰数
    【BZOJ】【1565】【NOI2009】PVZ 植物大战僵尸
  • 原文地址:https://www.cnblogs.com/Simon-X/p/6286332.html
Copyright © 2020-2023  润新知