首页 > 其他 > 详细

POJ 1979 深度优先遍历

时间:2014-03-07 17:17:36      阅读:477      评论:0      收藏:0      [点我收藏+]

题意:有红色和黑色的格子,只能走黑色的,问从起始位置出发,最多能走到达多少块黑色格子。

分析:相当于走迷宫,黑色格子是路,红色格子是墙,每次到达一个未到达过的格子时计数,原点也算是一个。每次可以走上下左右四个方向,用深度优先遍历从原点起始,一直到遍历所有能到达的格子。需要注意的是,不要重复走同一个格子,可以采取数组标记已走过的格子,但这里只需简单将已走过的格子标记为红色就可以达到目的,因为红色的格子也不可走。

C++代码:

bubuko.com,布布扣
#include <cstdio>

const int MAX_W = 20;
const int MAX_H = 20;

//输入
int W;
int H;
char maze[MAX_H][MAX_W + 1];

//4个方向
const int d[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};

int dfs(int x, int y){
    int ans = 0;
    for(int i = 0; i < 4; i ++){
        int nx = x + d[i][0], ny = y + d[i][1];
        if(0 <= nx && nx < H && 0 <= ny && ny < W && maze[nx][ny] == .){
            ans ++;
            maze[nx][ny] = #;
            ans += dfs(nx, ny);
        }
    }
    return ans;
}

void solve(){
    //找出起始位置
    int sx, sy;
    for(int i = 0; i < H; i ++){
        for(int j = 0; j < W; j ++){
            if(maze[i][j] == @){
                sx = i;
                sy = j;
                break;
            }
        }
    }
    //深度优先遍历,每到一个新位置就计数
    int ans = 1 + dfs(sx, sy);
    printf("%d\n", ans);
}

int main(int argc, char const *argv[]){

    while(scanf("%d %d", &W, &H)){
        if(W == 0 && H == 0) break;
        for(int i = 0; i < H; i ++)
            scanf("%s", maze[i]);
        solve();
    }

    return 0;
}
bubuko.com,布布扣

POJ 1979 深度优先遍历,布布扣,bubuko.com

POJ 1979 深度优先遍历

原文:http://www.cnblogs.com/7hat/p/3583759.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!