【复习】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没有必要)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值