• 暑期第一弹<搜索> A


    A - 棋盘问题
    Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u
    Submit Status

    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,那就要考虑每层搜索时的所有情况了。题意说不能同一行同一列,那么我们就从行入手,每一层搜索从当前行到最后一行,初始化为第一行。每一层的状态为每一行可以放棋子的位置。当已经放置的棋子数 = 规定的棋子数的时候,计数器+1,返回上一层。此时会进入上一层(假设为第n层)的下一个状态,因此要回溯,也就是说将第n层的刚刚使用过的状态致空,设置为未访问状态。具体可以利用树来理解,非常容易理解。

    代码如下:

    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;
    
    int n,k;
    int Map[10][10];
    int visit[10];
    long long ans = 0;
    
    void dfs(int row,int cont){     //row:行  cont:已经放置的棋子数
        if(cont == k+1){
            ans++;
            return ;
        }
        for(int i = row;i <= n;i ++){       //层
            for(int j = 1;j <= n;j ++){     //每一层的 n 个状态
                if(Map[i][j] == 0 && !visit[j]){
                    visit[j] = 1;
                    dfs(i+1,cont+1);
                    visit[j] = 0;       //回溯
                }
            }
        }
        return ;
    }
    int main()
    {
    
        while(cin>>n>>k){
            if(n == -1 && k == -1)  break;
            string s;
            for(int i = 1;i <= n;i ++){
                cin>>s;
                for(int j = 0;j < n;j ++){
                    if(s[j] == '#') Map[i][j+1] = 0;
                    else
                        Map[i][j+1] = 1;
                }
            }
    
            ans = 0;
            memset(visit,0,sizeof(visit));
            dfs(1,1);
            cout<<ans<<endl;
        }
        return 0;
    }
    




  • 相关阅读:
    腾讯//全排列
    腾讯//全排列
    腾讯//子集
    腾讯//子集
    腾讯///括号生成
    腾讯///括号生成
    腾讯//二叉树的最近公共祖先
    腾讯//二叉树的最近公共祖先
    腾讯//二叉搜索树的最近公共祖先
    腾讯//二叉搜索树的最近公共祖先
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6351943.html
Copyright © 2020-2023  润新知