• 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

    分析:
    题目很简单,类似于n皇后问题,关键在于判断当前点能不能放棋子,能放的话也可以选择放和不放两种情况。

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int n,k;
    char mp[10][10];
    int ans=0;
    bool flag(int x,int y)///判断当前这个坐标能不能放棋子
    {
        for(int i=x-1; i>=0; i--) ///判断同一列有没有放过
        {
            if(mp[i][y]=='*')
                return false;
        }
    
        for(int j=y-1; j>=0; j--) ///判断同一行有没有放过
        {
            if(mp[x][j]=='*')
                return false;
        }
        return true;
    }
    
    void dfs(int cur,int s)///分别表示走到第几个格子和放了多少个棋子
    {
        if(s==k)///已经放过k个了
        {
            ans++;
            return ;
        }
    
        if(cur==n*n)///已经走到末尾了
        {
            return ;
        }
    
        int i=cur/n;///获得所在的行
        int j=cur%n;///获得所在的列
    
        if(mp[i][j]=='#'&&flag(i,j))///当前为棋盘,并且能够放棋子
        {
            mp[i][j]='*';///标记放过
            dfs(cur+1,s+1);
            mp[i][j]='#';///标记释放
        }
        dfs(cur+1,s);///能放但是不放或者不能放,都直接往下走
    }
    int main()
    {
        while(~scanf("%d%d",&n,&k))
        {
            ans=0;
            if(n==-1&&k==-1)
                break;
            for(int i=0; i<n; i++)
                scanf(" %s",mp[i]);
            dfs(0,0);
            printf("%d
    ",ans);
        }
    }
    
  • 相关阅读:
    Java IO<2> 输入/输出流 FileInputStream/FileOutputStream
    springcloud1
    Java IO<4>Java io与装饰器模式
    springcloud2
    操作系统——第四章课后习题答案01
    操作系统学习笔记_04
    不夸张地说,在程序员里面,我算得上玩EXCEL比较溜的!
    IIS 发布 Vue2 + Net Core Api
    算法
    《无垠的太空(9).利维坦陨落》插曲:梦中人(2)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7220425.html
Copyright © 2020-2023  润新知