1、题目类型:模拟、DFS。
2、解题思路:类似八皇后问题的DFS。
3、注意事项:注意DFS内部剪枝,以提高运行时间效率。
4、实现方法:
#include < iostream >
using namespace std;
int n,k,num,ans;
bool map[ 9 ][ 9 ],col[ 9 ];
void DFS( int k)
{
int i;
if (k == 0 )
{
ans ++ ;
return ;
}
if (num >= n)
return ;
if (k > (n - num))
return ;
num ++ ;
for (i = 1 ;i <= n;i ++ )
{
if ( ! map[num][i])
continue ;
if (col[i])
continue ;
col[i] = 1 ;
DFS(k - 1 );
col[i] = 0 ;
}
DFS(k);
num -- ;
return ;
}
int main()
{
char ch;
int i;
while (cin >> n >> k)
{
if (n ==- 1 && k ==- 1 )
break ;
memset(map, 0 , sizeof (map));
memset(col, 0 , sizeof (col));
ans = 0 ;
for (i = 1 ;i <= n;i ++ )
for ( int j = 1 ;j <= n;j ++ )
{
cin >> ch;
if (ch == ' # ' )
map[i][j] = 1 ;
}
for (i = 1 ;i <= n;i ++ )
{
num = 1 ;
if ( ! map[num][i])
continue ;
if (col[i])
continue ;
col[i] = 1 ;
DFS(k - 1 );
col[i] = 0 ;
}
DFS(k);
cout << ans << endl;
}
return 0 ;
}