http://acm.hdu.edu.cn/showproblem.php?pid=1045
深搜。在find()函数找上下左右是否有碉堡的时候,要从x-1和y-1为起点开始搜。如果从0为起点开始搜 则错误。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cctype>
using namespace std;
int n,tmp;
char a[4][4];
bool find(int x,int y)
{
for(int i =x-1;i>=0;i--)
{
if(a[i][y] == 'O')
return false;
if(a[i][y] == 'X')
break;
}
for(int i= y-1;i>= 0;i--)
{
if(a[x][i] == 'O')
return false;
if(a[x][i] == 'X')
break;
}
return true ;
}
void dfs(int k,int current)
{
int x,y;
if(k == n*n)
{
if(current > tmp)
{
tmp = current;
return ;
}
}
else
{
x=k/n;
y=k%n;
if(a[x][y]== '.'&&find(x,y))
{
a[x][y]='O';
dfs(k+1,current+1);
a[x][y]='.';
}
dfs(k+1,current);
}
}
int main()
{
while(cin>>n)
{
if(n == 0)
break;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
tmp=0;
dfs(0,0);
cout<<tmp<<endl;
}
}