POJ 1321 棋盘问题

来源:互联网 发布:淘宝的评论管理在哪里 编辑:程序博客网 时间:2024/06/04 00:27
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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,但是思想上有一点深度广度结合的感觉,代码如下:

#include<cstring>#include<iostream>using namespace std;bool chess[10][10];int state;int n,m;bool visit[10];void DFS(int row,int num){    if(num==m)    {        state++;        return ;    }    if(row>n) return ;    for(int i = 1;i<=n;i++)        if(chess[row][i]&&!visit[i])    {        visit[i] = true;        DFS(row+1,num+1);        visit[i] = false;    }    DFS(row+1,num);    return ;}int main(){    while(cin>>n>>m)    {        if(n==-1&&m==-1) break;        memset(chess,false,sizeof(chess));        memset(visit,false,sizeof(visit));        state = 0;        for(int i = 1;i<=n;i++)            for(int j =1;j<=n;j++)        {            char qipan;            cin>>qipan;            if(qipan == '#') chess[i][j] = true;        }        DFS(1,0);        cout<<state<<endl;    }    return 0;}


0 0