POJ 1321, 棋盘问题

Time Limit: 1000MS  Memory Limit: 10000K
Total Submissions: 6342  Accepted: 3061


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

扫描二维码关注公众号,回复: 6736636 查看本文章

Source
蔡错@pku


//  POJ1321.cpp : Defines the entry point for the console application.
//

#include 
< iostream >
using   namespace  std;
int  DFS( char  board[ 9 ][ 9 ],  int  N,  int  s,  int  k)
{
    
if  (k  ==   0 return   1 ;
    
    
int  cnt  =   0 ;
    
for  ( int  i  =  s; i  <  N;  ++ i)
        
for  ( int  j  =   0 ; j  <  N;  ++ j)
            
if (board[i][j]  ==   0 )
            {
                
for  ( int  k  =   0 ; k  <  N;  ++ k){ ++ board[k][j]; ++ board[i][k];}
                cnt 
+=  DFS(board,N,i  +   1 , k  -   1 );
                
for  ( int  k  =   0 ; k  <  N;  ++ k){ -- board[k][j]; -- board[i][k];}
            };
    
return  cnt;
}
int  main( int  argc,  char *  argv[])
{
    
char  board[ 9 ][ 9 ];
    
int  N, K;
    
while (scanf( " %d %d\n " & N,  & K)  &&  N  !=   - 1   &&  K  !=   - 1 )
    {
        
for  ( int  i  =   0 ; i  <  N;  ++ i) gets(board[i]);
        
for  ( int  i  =   0 ; i  <  N;  ++ i)
            
for  ( int  j  =   0 ; j  <  N;  ++ j)
                board[i][j] 
=  (board[i][j]  ==   ' # ' ?   0 1 ;

        cout 
<<  DFS(board,N, 0 ,K) << endl;
    }
    
return   0 ;
}

转载于:https://www.cnblogs.com/asuran/archive/2009/10/10/1580180.html

猜你喜欢

转载自blog.csdn.net/weixin_34055787/article/details/94139734