zoukankan      html  css  js  c++  java
  • A

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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中row意思为放在的第row行,cnt意思是放了cnt个棋子,类似于动态规划的状态定义,搜索中有了明确的状态定义(动态规划中是DP数组各维的意义,DFS中是各个参数的意义)后,就可以写类似转台转移方程的递归向深函数了,体现在代码中就是循环搜整个棋盘找到未标记并且可放的点(因为每一层的标记点互不影响,所以要回溯),实现dfs(r + 1,cnt + )---->下一行,下一个。

    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int n,k;
    int ans = 0;
    int vis[10];
    char maze[10][10];
    
    int check(int x,int y)
    {
        if(maze[x][y] == '#' && vis[y] == 0)
        {
            return 1;
        }
        return 0;
    }
    
    void dfs(int row,int cnt)//一行一行的来
    {
    ////意思是行数超过n - 1就剪枝,加了也不影响、
    //    if(row > n)//这个要不要加嘞??
    //    {
    //        return;//看来还是不要加的为好
    //    }
        if(cnt == k)
        {
            ans++;
            return;
        }
        //就是少了下面这个循环才错掉的。
    //    for(int r=row;r<=n-(k-cnt);r++)//这个循环也可以,但我不太明白
        for(int r = row; r < n; r ++)
            for(int i = 0; i < n; i++)
            {
                if(check(r,i))//坐标对应二维数组的下标
                {
                    //对应x,y的话总是弄得自己好晕。。。
                    vis[i] = 1;//回溯,保证各个层次之间的遍历不会相互影响
                    dfs(r + 1,cnt + 1);
                    vis[i] = 0;//我靠,忘记改下标了
                }
            }
    }
    
    int main()
    {
        while(~scanf("%d%d",&n,&k) && n != -1 && k != -1)
        {
            ans = 0;//我去,又忘记初始化了。
            memset(vis,0,sizeof(vis));
            for(int i = 0; i < n; i++)
            {
                scanf("%s",maze[i]);//scanf("%c")毒瘤
            }
            dfs(0,0);
            printf("%d
    ",ans);
        }
    }
    
    
  • 相关阅读:
    TQJson序列和还原clientdataset.data
    BPL插件框架的二种实现
    数据序列的本质论
    MSGPACK(一)
    内存数据库和关系数据库之间的数据同步原理
    redis神器
    从Cell的视图推出一个新的界面
    iOS -- DES算法
    Base64---加密
    iOS -- MD5加密
  • 原文地址:https://www.cnblogs.com/tomjobs/p/10612577.html
Copyright © 2011-2022 走看看