poj 1321 棋盘问题

来源:互联网 发布:小额贷款什么软件好 编辑:程序博客网 时间:2024/06/06 04:59

题目链接:点击打开链接

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

21
ps:对每一行每一列的遍历搜索,因为不能重行重列,就对其每一行每一行的搜索,在每一行中在搜索每一列,标记列是否来过,避免重列.每次把k个棋子放入棋盘时,方案数加一.
<span style="font-size:24px;">#include <iostream>#include<cstring>#include<cstdio>#include<cstdlib>using namespace std;char mp[10][10];int r[10];int n,k;int ans=0;void dfs(int row,int d){    if(d==k)    {        ans++;        return ;    }    for(int i=row;i<n;i++)    {        for(int j=0;j<n;j++)        {            if(mp[i][j]=='#'&&!r[j])            {                r[j]=1;                dfs(i+1,d+1);                r[j]=0;            }        }    }}int main(){    while(cin>>n>>k)    {        if(n==-1&&k==-1)break;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                cin>>mp[i][j];            }        }        memset(r,0,sizeof(r));        ans=0;        dfs(0,0);        cout<<ans<<endl;    }    return 0;}</span>


0 0
原创粉丝点击