棋盘问题--POJ 1321

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 ;
}

 

你可能感兴趣的:(poj)