poj 1321 棋盘问题

#include<iostream>
using namespace std;
int board[10][10];
int n,k,c;
void dfs(int num)
//深度搜索。棋盘上的一个点共有三种状态:未放棋子的棋盘点,放了棋子的棋盘点,空白点。分别用:等于0,大于0,小于0
{
if(num>k)
{
c
++;
return;
}
for(int u=num-1;u<n;u++)
{
if(k-num>n-1-u)
return;
for(int i=0;i<n;i++)
{
//同一行不允许存在两个棋子
if(board[u][i]>0)
break;
if(board[u][i]==0)
{
int j;
//同一行不允许存在两个棋子
for(j=i+1;j<n;j++)
if(board[u][j]>0)
break;
if(j<n)
break;
//同一列不允许存在两个棋子
for(j=0;j<u;j++)
if(board[j][i]>0)
break;
if(j==u)
{
board[u][i]
=num;
dfs(num
+1);
board[u][i]
=0;
}
}
}
}
}
int main()
{
char str[10];
while(cin>>n>>k&&(n!=-1||k!=-1))
{
for(int i=0;i<n;i++)
{
cin
>>str;
for(int j=0;j<n;j++)
{
if(str[j]=='#')
board[i][j]
=0;
else
board[i][j]
=-1;
}
}
c
=0;
dfs(
1);
cout
<<c<<endl;
}
}

  

posted on 2011-07-17 23:59  sysu_mjc  阅读(127)  评论(0编辑  收藏  举报

导航