关键点:起始点不一定为(0,0),而可能是地图上的任意一点。并且寻找下一个状态时,不一定是上下左右四个邻接点,而是直接遍历地图上的所有点。
AC代码:
#include<iostream>
#include<string.h>
#include<string>
#include<fstream>
using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //对应上下左右
char M[5][5];
int n,ans=0,i_max=0;
bool valid(int x,int y) //在坐标范围内
{
if(x<0||y<0||x>=n||y>=n)
{
return 0;
}
return 1;
}
bool judge(int x,int y) //是否满足条件
{
if(valid(x,y)&&M[x][y]=='.') //坐标满足且当前位置为空
{
int flag_wall=0;
for(int i=x-1;i>=0;i--) //向上检索
{
if(M[i][y]=='1') //检测到blackhouse
{
if(!flag_wall)return 0; //如果之前没有墙,则不满足条件
}
else if(M[i][y]=='X') //检测到墙
{
flag_wall++;
}
}
for(int i=x+1,flag_wall=0;i<n;i++) //向下检索
{
if(M[i][y]=='1')
{
if(!flag_wall)return 0;
}
else if(M[i][y]=='X')
{
flag_wall++;
}
}
for(int i=y-1,flag_wall=0;i>=0;i--) //向左检索
{
if(M[x][i]=='1')
{
if(!flag_wall)return 0;
}
else if(M[x][i]=='X')
{
flag_wall++;
}
}
for(int i=y+1,flag_wall=0;i<n;i++) //向右检索
{
if(M[x][i]=='1')
{
if(!flag_wall)return 0;
}
else if(M[x][i]=='X')
{
flag_wall++;
}
}
return 1;
}
return 0;
}
void dfs(int x,int y)
{
if(judge(x,y)) //如果该位置满足条件
{
M[x][y]='1';
ans++;
if(ans>i_max)
{
i_max=ans;
}
for(int i=0;i<4;i++) //寻找下一个点
{
for(int j=0;j<4;j++)
{
dfs(i,j);
}
}
//回溯
M[x][y]='.';
ans--;
}
return;
}
int main()
{
while((cin>>n)&&n)
{
memset(M,' ',sizeof(M));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>M[i][j];
}
}
ans=i_max=0;
for(int i=0;i<4;i++) //每个位置都为起始点开始DFS
{
for(int j=0;j<4;j++)
{
dfs(i,j);
}
}
cout<<i_max<<endl;
}
return 0;
}
博客指出地图搜索问题中,起始点不一定是(0,0),可能是地图上任意一点。在寻找下一个状态时,并非局限于上下左右四个邻接点,而是直接遍历地图上所有点,还给出了AC代码。
2994

被折叠的 条评论
为什么被折叠?



