HDU 1312 Red and Black --- 入门搜索 BFS解法

  HDU 1312

  题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象为墙,然后.为可以走的空地,求人可以走的最大点数。

  解题思路:从起点开始,起点的四个方向满足条件的点分别入队(放置重复入队,需只要一入队就标记已访问而不是取出时再进行标记),直至队为空。

/*HDU 1312 ----- Red and Black  入门搜索 BFS解法*/
#include <cstdio>
#include <queue>
using namespace std;

int n, m; //n行m列
int cnt;
char mapp[25][25];
int dirx[4] = { -1, 1, 0, 0 }; 
int diry[4] = { 0, 0, -1, 1 }; //用于循环来访问4个方向
struct Node{
    int x, y;
};
queue<Node> q;

void bfs(){
    /*队不为空时 表明还可以近一步搜索*/
    /*在队中的点都是已访问过、但需近一步访问周围四个方向的点的点*/
    while (!q.empty()){
        Node tmp = q.front();
        q.pop();
        Node tmp2;
        /*近一步判断该点的四个方向四否可以访问*/
        for (int i = 0; i < 4; ++i){
            //tmp2即为4个方向的点
            tmp2.x = tmp.x + dirx[i];
            tmp2.y = tmp.y + diry[i];
            if (tmp2.x >= 0 && tmp2.x < n && tmp2.y >= 0 && tmp2.y < m
                && mapp[tmp2.x][tmp2.y] != '#'){
                //该点可访问
                ++cnt;
                mapp[tmp2.x][tmp2.y] = '#'; //访问过后标记为不可访问
                q.push(tmp2); //入队以下次循环近一步搜索
            }
        }//for(i)
    }//while(empty)
}

int main()
{
    int startx, starty;
    //m行m列 注意题目先给出列数
    while (scanf("%d%d", &m, &n) == 2 && (m + n)){
        for (int i = 0; i < n; ++i){
            scanf("%s", mapp[i]);
            for (int j = 0; j < m; ++j){
                if ('@' == mapp[i][j]){
                    startx = i;
                    starty = j;
                    cnt = 1; //初始化找到一块
                    mapp[i][j] = '#'; //访问过后为已访问过
                }
            }
        }//for(i)
        Node start;
        start.x = startx; start.y = starty;
        q.push(start);
        bfs();
        printf("%d
", cnt);
    }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/tommychok/p/5020425.html