poj1321(棋盘问题)

题目:

棋盘问题

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 2   Accepted Submission(s) : 2
Problem 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
 
代码:
#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
bool vis[9];
int map[9][9];  //判断该位置是否可放
bool lie[9];
int ans;
int n,t,k;
void dfs( int p )
{
    int i,j;
    if( t==k )
    {
        ans++;
        return;
    }
    if( p>n )
        return;
    for( i=0;i<2;i++ )
    {
        if( i==0 )
            dfs(p+1);
        else
        {
            for( j=1;j<=n;j++ )
            {
                if( map[p][j]==0 && vis[j]==0 )
                {
                    vis[j]=1;
                    t++;
                    dfs(p+1);
                    t--;
                    vis[j]=0;
                }
            }
        }
    }
}
int main()
{
    
    while( scanf("%d%d",&n,&k)!=EOF )
    {
        if( n==-1 && k==-1 )
            break;
        t=0;
        ans=0;
        memset(vis,0,sizeof(vis));
        memset( map,0,sizeof(map) );
        char tt;
        for(int i=1;i<=n;i++ )
        {
            getchar();
            for( int j=1;j<=n;j++ )
            {
                scanf("%c",&tt);
                if( tt=='.' )
                    map[i][j]=1;
            }
        }
        dfs(1);
        printf("%d\n",ans);
    }
    return 0;
}

10分钟代码,和大雁两个小时debug,原因就是忘了删除main()里面的全局变量。吐血

posted @ 2012-07-25 16:08  萧若离  阅读(231)  评论(0)    收藏  举报