汉语题意,题目类似八皇后问题,深搜即可。。。貌似可以用状态压缩过,有空再研究研究。。
// 172K 63MS
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 9
using namespace std ;
bool graph[N][N] ;
bool flag[N][N] ;
bool column[N] ;
int ans ;
void
Init_Graph ( int const n ) //建图
{
ans = 0 ; //初始化ans , flag数组,column数组
memset ( flag , 0 , sizeof ( flag ) ) ;
memset ( column , 0 , sizeof ( column ) ) ;
for ( int i = 1 ; i <= n ; i ++ )
{
for ( int j = 1 ; j <= n ; j ++ )
{
char ch ;
ch = getchar ( ) ;
if ( '#' == ch )
{
graph[i][j] = true ;
}
else if ( '.' == ch )
{
graph[i][j] = false ;
}
}
getchar ( ) ; //吃掉回车
}
}
void
DFS ( int const now_row , int const row , int const num , int const sum ) // num 代表当前已放棋子数,sum 代表总棋子数
{
if ( num == sum )
{
ans ++ ;
return ;
}
else if ( now_row > row )
{
return ;
}
else
{
for ( int j = 1 ; j <= row ; j ++ ) // 遍历列
{
if ( graph[now_row][j] && !flag[now_row][j] && !column[j] )
{
column[j] = true ;
flag[now_row][j] = true ;
DFS ( now_row + 1 , row , num + 1 , sum ) ;
flag[now_row][j] = false ;
column[j] = false ;
}
}
DFS ( now_row + 1 , row , num , sum ) ; //注意这个状态
}
}
int
main ( )
{
int n , k ;
while ( EOF != scanf ("%d%d" , & n , & k ) )
{
if ( -1 == n && -1 == k )
{
break ;
}
getchar ( ) ; //吃掉第一个回车
Init_Graph ( n ) ;
DFS ( 1 , n , 0 , k ) ;
printf ("%d\n" , ans ) ;
}
return 0 ;
}