• 【BFS】hdu 1312 Red and Black


    题目描述:

    http://acm.hdu.edu.cn/showproblem.php?pid=1312

    中文大意:

    一个长方形的房间,铺着方砖,每块方砖被标记为 # 或黑点. 。

    一个人站在起点 @ ,可以上、下、左、右移动,但只能移动到标记为黑点的方砖上,不能移动到标记为 # 的方砖上。

    要求:求可遍历到的黑点数目。

    思路:

    (1)把起点 s 放到队列 q 中;
    (2)如果 q 是空队列,则过程结束,否则继续;
    (3)取队列 q 中最前面的节点 node;
    (4)尝试访问 node 节点的四周节点。若没有后继节点,则转到(2);
    (5)把 node 的所有后继节点放在队列 q 的末端,并标记为不可再被访问;
    (6)转到(2)。

    如果有目标节点,则将(6)改为:若后继节点中某一个是目标节点,则找到一个解,过程结束,否则转到(2)。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int x,y;
    };
    
    int dir[4][2] = {
    {0, -1}, //
    {1, 0}, //
    {0, 1}, //
    {-1, 0} //
    };
    
    int w,h;
    char** room;
    
    bool check(node tem)
    {
        if(tem.x>=0&&tem.x<w&&tem.y>=0&&tem.y<h)
        {
            return true;
        }
        return false;
    }
    
    void BFS(int dx, int dy)
    {
        int num = 1;
        
        node start, next;
        start.x = dx;
        start.y = dy;
        
        queue<node> q;
        q.push(start);
        
        while(!q.empty())
        {
            start = q.front();
            q.pop();
            //尝试四个方向 
            for(int i=0;i<4;i++) 
            {
                next.x = start.x + dir[i][0];
                next.y = start.y + dir[i][1];
                if(check(next)&&room[next.y][next.x]=='.')
                {
                    room[next.y][next.x] = '#';
                    num++;
                    q.push(next);
                }
            }
        }
        printf("%d
    ", num);
    }
    
    int main()
    {
        while(scanf("%d%d", &w, &h)&&(w!=0&&h!=0))
        {
            int dx, dy;
            room = new char*[h];
            for(int i=0;i<h;i++)
            {
                room[i] = new char[w];
                scanf("%s", room[i]);
                for(int j=0;j<w;j++)
                {
                    if(room[i][j] == '@')
                    {
                        dx = j;
                        dy = i;
                        break;
                    }
                }
            }
            
            BFS(dx, dy);
        }
    }
    作者:老干妈就泡面
    本文版权归作者和博客园共有,欢迎转载,但请给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    第42天:焦点图
    第41天:匀速、缓动运动和图片无缝滚动
    第40天:字符串操作:截取字符串
    MyBatis一级缓存(转载)
    Mycat 做简单的读写分离(转载)
    ui设计的好网站(转载)
    Java面试常问的问题(转载)
    ios学习的博客地址
    策略模式
    dubbo框架的简单介绍
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/14295624.html
Copyright © 2020-2023  润新知