原题链接:
http://poj.org/problem?id=1321
题目大意:
(中文题。不说)
思路:
每次DFS都只找下一行(前几行已经放过,不用搜索了)
用一个数组来存放列信息。用于判断能不能在这一列放棋子
dfs中循环遍历每一个可以放置的位置,可以顺便解决空行的问题
因为存在回头问题。所以check_row的值在dfs完之后要改回0
这样才保证其他点的搜索正常
代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
char table[10][10];
int TableSize,Number;
int check_row[10];//存放这一列有没有放过棋子的信息。
int Cou;
void dfs( int Now_Line,int HaveSet )
{
if( HaveSet == Number )
{
Cou++;
}
else
{
int i,j;
for( i = Now_Line+1 ; i <= TableSize; i++ )
for( j = 1; j <= TableSize; j++ )
{
if( table[i][j] == '#' && check_row[j] == 0 )
{
check_row[j] = 1;
dfs( i, HaveSet + 1 );
check_row[j] = 0;
}
}
}
}
int main()
{
while( cin >> TableSize >> Number )
{
if( TableSize == -1 && Number == -1 ) break;
int i,j;
for( i = 1; i <= TableSize; i++ )
for( j = 1; j <= TableSize; j++ )
cin>>table[i][j];
Cou = 0;
memset( check_row,0,sizeof(check_row));
dfs( 0,0 );
cout<<Cou<<endl;
}
return 0;
}