分析:放过炮台的标记为‘ @ ‘(回溯要还原) 递归,下一次遍历时向四个方向延伸(一行或者一列),找到‘@‘ 则标记为不行,若找到‘X‘或边界则标记为行。
这题貌似还可以用二分匹配做。
#include<iostream>
using namespace std;
#define N 5
char map[N][N];
int dir[4][2]={-1,0,0,-1,1,0,0,1};
int n,max;
bool judge(int x,int y)
{
int i,tx,ty;
for(i=0;i<4;i++)
{
tx=x;
ty=y;
while(true) //一直往外延伸
{
tx=tx+dir[i][0];
ty=ty+dir[i][1];
if(map[tx][ty]=='@')
return false;
else if(map[tx][ty]=='X')
break;
else if(tx< 1 || ty<1 || tx>n || ty>n)
break;
}
}
return true;
}
void dfs(int num)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]=='.' && judge(i,j))
{
map[i][j]='@';
dfs(num+1);
map[i][j]='.';
}
if(max<num) //得到最大值
max=num;
}
int main()
{
int i,j;
while(cin>>n,n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>map[i][j];
max=0;
dfs(0);
cout<<max<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/a809146548/article/details/46362015