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
    题意:中文题。。。。题目要求棋子不能在同一行或同一列,那么我们可以从第一行开始遍历,一般输出方案,方法有多少种时用DFS。
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    char Map[20][20];
    int n, vis[20], ans, K; ///ans记录方案个数
    
    void DFS(int u, int k)
    {
        int i, j;
    
        if (k == K) ///总共是K个棋子,那么当步数达到K时,就是一种方案了
        {
            ans++;
            return ;
        }
    
        if (u == n) return ; ///u是行,达到边界时不用再继续
    
        for (i = u; i < n; i++) ///从这一行开始向下遍历
        {
            for (j = 0; j < n; j++)
            {
                if (Map[i][j] == '#' && !vis[j]) ///当发现有一列没有放棋子时步数加1
                {
                    vis[j] = 1;
                    Map[i][j] = '.';
                    DFS(i+1, k+1); ///下一次DFS时步数加1,注意行数是i+1,不是u+1,这里我总是错,这次调试终于自己找出来了。。。。
                    Map[i][j] = '#';
                    vis[j] = 0;
                }
            }
        }
    }
    
    int main ()
    {
        int i;
    
        while (scanf("%d%d", &n, &K), n != -1 || K != -1)
        {
            for (i = 0; i < n; i++)
                scanf("%s", Map[i]);
    
            memset(vis, 0, sizeof(vis)); ///标记每一列是否遍历,因为我们遍历的是行,那么行就不用标记了
            ans = 0;
    
            DFS(0, 0); ///一开始从第一行开始遍历,步数为零
    
            printf("%d
    ", ans);
        }
    
        return 0;
    }
  • 相关阅读:
    求连续子数组的最大和
    【LeetCode练习题】Gas Station
    再来看看快速排序
    【LeetCode练习题】First Missing Positive
    【LeetCode练习题】Merge Sorted Array
    Hdu 2089-不要62 数位dp
    Tsinsen A1517. 动态树 树链剖分,线段树,子树操作
    Bzoj 3505: [Cqoi2014]数三角形 数论
    Poj 3695-Rectangles 矩形切割
    Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
  • 原文地址:https://www.cnblogs.com/syhandll/p/4839747.html
Copyright © 2011-2022 走看看