现在的位置: 首页 > 综合 > 正文

POJ 1321 棋盘问题

2018年01月17日 ⁄ 综合 ⁄ 共 1579字 ⁄ 字号 评论关闭
棋盘问题
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 23908   Accepted: 11839

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

Source

[Submit]   [Go Back]   [Status]  
[Disc

解题思路:

算是一道最为基础的DFS入门题目了,题目就是说,输入一个n,决定了棋盘的大小,然后呢,'#'是可以放棋子的地方,'.'是不可以放棋子的地方,接下来,你要做的就是把m个棋子放到这样一个你人为构造的棋盘中,必须要满足任意两个棋子不能放在同一行和同一列..QAQ!

其实,先开始由样例的输入格式,我们就知道了应该用char ch;配合getchar()来构造这个棋盘,因为任意两个字符之间没有空格,所以,我们边输入边构造,把'#'的地方变成1,把'.'的地方变成0,那么这个棋盘就被我们变成了一个由0-1组成的矩阵了,接下来呢,我们就从(0,0)开始,也就是这个棋盘的左上角开始,一步一步的找了,只要找到符合位置的地方,我们就把这个位置标记下,然后一步一步的递归,其实有关DFS的深入理解,我还是蛮推荐"啊哈算法"的,因为关于DFS讲解的很清楚...有兴趣的可以去看下啊...

这道题还有一点需要注意的就是关于x和y在棋盘上的移动问题,移动其实很简单,就是我们说的画画了,利用这个,int x = pos/n;  int y = pos %n;

代码:

# include<cstdio>
# include<iostream>
# include<cstring>

using namespace std;

int map[10][10];
int row[10];
int col[10];
int ans,n,m;

void input()
    {
        memset(map,0,sizeof(map));
        char ch;
        getchar();
        for ( int i = 0;i < n;i++ )
            {
                for ( int j = 0;j < n;j++ )
                    {
                        ch = getchar();
                        if ( ch == '#' )
                            {
                                map[i][j] = 1;
                            }
                            else
                                {
                                    map[i][j] = 0;
                                }
                    }
                    getchar();
            }

    }


void dfs( int pos ,int num )
    {
        if ( num == m )
            {
                ans++;
                return;
            }

        while ( pos<n*n )
            {
                int x = pos/n;
                int y = pos%n;

                if ( map[x][y] == 1 && !row[x]&&!col[y] )
                    {
                        row[x] = 1;
                        col[y] = 1;
                        dfs ( pos+1,num+1 );
                        row[x] = 0;
                        col[y] = 0;
                    }

                pos++;



            }



    }




int main(void)
{
    while ( cin>>n>>m )
        {
            if ( n==-1&&m==-1 )
                {
                    break;
                }

            input();

            memset(row,0,sizeof(row));
            memset(col,0,sizeof(col));
            ans = 0;
            dfs(0,0);
            cout<<ans<<endl;



        }





    return 0;
}

抱歉!评论已关闭.