【复习】hdu1312red and black

搜索模板题经典题
这道题就是搜索从@这里联通多少个。所以输入图标记起点(由于起点可能会重复遍历所以标记)从起点出发用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没有必要)

猜你喜欢

转载自blog.csdn.net/weixin_43331783/article/details/88671457