搜索模板题经典题
这道题就是搜索从@这里联通多少个。所以输入图标记起点(由于起点可能会重复遍历所以标记)从起点出发用dir模拟搜索(如果有斜线只需要更改dir即可在刘汝佳的书上使用两个循环模拟也可,只是我觉得这个方法普适性较大就这样使用)具体搜索分三个模块,一模拟,二判断(看是否可以走下一步并且标记走的地方,这里最好写一个函数,看起来清晰)三具体要求(比如说到底是求连通块数量,而是路径长)写好这三个就差不多了,记得要return
#include<iostream>
#include<stdio.h>
using namespace std;
#include<string.h>
const int maxn=25;//地图范围
int w,h,fx,fy,ans;
char mp[maxn][maxn];
int flag[maxn][maxn];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int pd(int x,int y)
{
return((x>=1)&&(x<=h)&&(y>=1)&&(y<=w)&&(!flag[x][y])&&(mp[x][y]!='#'));
}
void dfs(int x,int y)
{
ans+=1;
int nx,ny;
for(int e=0;e<4;e++)
{nx=x+dir[e][0];
ny=y+dir[e][1];
if(pd(nx,ny))
{
flag[nx][ny]=1;
dfs(nx,ny);
}
}
return ;
}
int main()
{
while(~scanf("%d%d",&w,&h)&&w&&h)
{
memset(flag,0,sizeof(flag));
for(int i=1;i<=h;i++)
{scanf("%s",mp[i]+1);//输入字符串不需&
//cin>>mp[i]+1;
for(int j=1;j<=w;j++)
if(mp[i][j]=='@')
{
fx=i;
fy=j;
flag[fx][fy]=1;//先标记不可以在下面输出减因为不知会遍历多少个
}}
ans=0;dfs(fx,fy);
printf("%d\n",ans);
}
}
这题有多种写法:
1.模拟可以使用dir也可以使用for循环
2.判断可以用函数也可以在dfs前面写多个return
3.具体要求可以定义ans在外面直接计算也可以ans在递归中增加并返回ans(感觉这里return没有必要)