• 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
  • 相关阅读:
    创建 Smarty 对象
    C#设计模式——命令模式(Command Pattern)
    Spring.Net 简单入门学习
    设计模式六大原则(6):开闭原则
    设计模式六大原则(5):迪米特法则
    设计模式六大原则(4):接口隔离原则
    设计模式六大原则(3):依赖倒置原则
    设计模式六大原则(2):里氏替换原则
    设计模式六大原则(1): 单一职责原则
    超简单!asp.net core前后端分离项目使用gitlab-ci持续集成到IIS
  • 原文地址:https://www.cnblogs.com/tommychok/p/5020425.html
Copyright © 2020-2023  润新知