poj1321--棋盘问题(搜索练习2,变形的八皇后问题)

棋盘问题
Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u
Submit   Status
Appoint description:   System Crawler  (2013-07-31)

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

变形的八皇后问题,统计好可以放棋子的点,dfs

 

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
char str[10][10] ;
int r[10] , l[10] ;
struct node
{
    int x , y ;
} p[100] ;
int cnt , ans ;
int n , k ;
void dfs(int num,int i)
{
    if( num == k+1 )
    {
        ans++ ;
        return ;
    }
    if( i >= cnt )
        return ;
    for( ; i < cnt ; i++)
    {
        if( r[ p[i].x ] == 0 && l[ p[i].y ] == 0 )
        {
            r[ p[i].x ] = 1 ; l[ p[i].y ] = 1 ;
            dfs(num+1,i+1) ;
            r[ p[i].x ] = 0 ; l[ p[i].y ] = 0 ;
        }
    }
}
int main()
{
    int i , j ;
    while( scanf("%d %d", &n, &k) != EOF )
    {
        cnt = 0 ;
        ans = 0 ;
        if( n == -1 && k == -1 ) break ;
        for(i = 0 ; i < n ; i++)
            scanf("%s", str[i]) ;
        for(i = 0 ; i < n ; i++)
            for(j = 0 ; j < n ; j++)
                if( str[i][j] == '#' )
                {
                    p[cnt].x = i ;
                    p[cnt++].y = j ;
                }
        memset(r,0,sizeof(r)) ;
        memset(l,0,sizeof(l)) ;
        dfs(1,0) ;
        printf("%d\n", ans) ;
    }
}


 

你可能感兴趣的:(poj1321--棋盘问题(搜索练习2,变形的八皇后问题))