ACM题目————棋盘问题

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//Asimple
#include <iostream>
#include <string.h>
 
using namespace std;
 
int n, T, num, cnt, p;
char Map[10][10];
int vis[10];//记录同一列是否有过棋子
 
using namespace std;
 
void DFS(int k)
{
    if( num == p )
    {
        cnt ++ ;
        return ;
    }
    if( k >= n ) return ;//边界
    for( int i=0; i<n; i++)
    {
        if(!vis[i] && Map[k][i]=='#')
        {
            vis[i] = 1 ;
            num ++ ;
            DFS(k+1);
            num -- ;
            vis[i] = 0 ;
        }
    }
    DFS(k+1);
}
 
int main()
{
    while( cin >> n >> p )
    {
        if( n == -1 && p == -1 ) break ;
        for (int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                cin >> Map[i][j] ;
        memset(vis,0,sizeof(vis));
        cnt = 0 ;
        num = 0 ;
        DFS(0);
        cout << cnt << endl ;
 
    }
 
    return 0;
}

 

 

posted @   Asimple  阅读(3067)  评论(2编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示