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

    棋盘问题-POJ 1321
    Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

    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<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #define N 10
    using namespace std;
    char maps[N][N];//代表着地图,也就是题上所说的n*n的矩阵
    int n, k, visit[N], Count;//visit代表标记数组,代表这一行是否被访问过,Count代表计数共有多少种方案
    void DFS(int column, int t);
    
    int main()
    {
        int i, j;
        while(scanf("%d%d", &n, &k),!(n==-1&&k==-1))
        {
            memset(visit, 0, sizeof(visit));
            for(i=0; i<n; i++)
            {
                getchar();
                for(j=0; j<n; j++)
                {
                    scanf("%c", &maps[i][j]);
                }
            }
            Count=0;
            DFS(0, 0);
            printf("%d
    ", Count);
        }
        return 0;
    }
    void DFS(int column, int t)//column代表列数,t代表所要求的情况的个数
    {
        if(t==k)//当摆够k个棋后就返回上一层
        {
            Count++;
            return ;
        }
        if(column>=n)//当列数超出界限后返回,不再搜索,返回上一层
            return;
        for(int i=0; i<n; i++)
        {
            if(visit[i]==0&&maps[i][column]=='#')//要仔细观察这里,要深刻理解递归是怎么进行的,就要理解这里
            {
                visit[i]=1;//标记这一行为访问过
                DFS(column+1, t+1);//搜索下一列,且棋子的个数加1
                visit[i]=0;//标记这一行为未访问过
            }
        }
        DFS(column+1, t);//此列遍历完后就搜索下一列,列数加以,但是棋子的个数不变
    }
    

      

    /*在这里提供一组测试数据的遍历模式
    3 2
    ###
    ###
    ###

    1代表搜索的第一个棋子,2代表第二个棋子,一共4+4+4+2+2+2=18种

    100
    022
    022
    四种
    022
    100
    022
    四种
    022
    022
    100
    四种
    010
    002
    002
    二种
    002
    010
    002
    二种
    002
    002
    010
    二种
    001
    000
    000

    000
    001
    000

    000
    000
    001

    */

    
    
  • 相关阅读:
    WPF如何判断PNG中的点是透明的
    Silverlight DataGrid自适应数据
    DEVExpress For WPF 中GridControl如何实现滚动分页(延迟查询)
    如何通过样式来处理根据自身其他属性内容赋值其他属性值的方法研究
    最近涉及到的一些需要备忘的东西
    (转载)Setup Factory 会话变量
    (转载)解决WPF动画属性锁死问题
    WPF InkCanvas MouseDown及MouseLeftButtonDown事件不触发的代替事件
    在win7与XP系统下 C#缺省路径不同
    Xamarin笔记
  • 原文地址:https://www.cnblogs.com/wazqWAZQ1/p/4463672.html
Copyright © 2011-2022 走看看