深度搜索DFS hdu-1312

//迷宫maze[20][20]
//宽度W,高度H
//计数变量count
//方向数组x_dir,y_dir
#include<stdio.h>


char maze[20][20];
int W,H;
int count=0;
int x_dir[4]={0,0,-1,1},y_dir[4]={1,-1,0,0};


void dfs(int y,int x)
{
    if(x>=W||y>=H||x<0||y<0) return ;
    if(maze[y][x]=='#') return ;
    count++;
    maze[y][x]='#';
    int t_x,t_y;
    for(int k=0;k<4;k++)
    {
        t_x=x,t_y=y;
        t_x+=x_dir[k];
        t_y+=y_dir[k];
        dfs(t_y,t_x);
    }
}


int main()
{
    while(scanf("%d %d",&W,&H)&&W+H)
    {
        int S_x,S_y;
        for(int i=0;i<H;i++)
        {
            scanf("%s",maze[i]);
            for(int j=0;j<W;j++)
            {
                if(maze[i][j]=='@')
                {
                    S_x=j,S_y=i;
                    break;
                }
            }
        }
        dfs(S_y,S_x);
        printf("%d\n",count);
        count=0;
    }
    return 0;
}

方法:递归深度搜索,采用过点,点变墙
注意:起始的count的值;
      注意W与x对应,H与y对应;
      注意数组maze的下标与x,y的关系(此题解为y为一维下标,x为二维下标);
      *注意递归函数中原变量在每次递归回来时是不变的
例如这样写递归函数:
<pre name="code" class="plain">void dfs(int y,int x)
{
    if(x>=W||y>=H||x<0||y<0) return ;
    if(maze[y][x]=='#') return ;
    count++;
    maze[y][x]='#';
    int t_x,t_y;
    t_x=x,t_y=y;
    for(int k=0;k<4;k++)
    {
        t_x+=x_dir[k];
        t_y+=y_dir[k];
        dfs(t_y,t_x);
    }
}
是不对的,这样写当测试坐标(i,j)的某个方向时且该方向不是最后一个方向的时候,如果满足不越界不碰墙的情况,那么在未遍历完该坐标(i,j)的上下左右四个方向,便已经使要遍历的坐标(i,j)变化;
修正错误:每次都要在for循环中对临时坐标进行赋原值,使其每次都为原坐标,从而达到只改变方向,使其完整遍历4个方向;
     用scanf()与%s组合可以使代码忽略回车作为字符的影响,从而可以不用getchar();


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值