zoukankan      html  css  js  c++  java
  • poj-2312

    题意:

    这个题是以坦克大战为原型出来的题目,就是走迷宫的变种,给定一个地图mxn的地图,地图上有普通的砖B,金砖S,河R,空地E,和一个宝物位置T,和你的位置Y,求吃到宝物的最小步数(坦克通过普通砖B需要两步,空地E一步,不能通过金砖和河)..

    样例输入

    3 4
    YBEB
    EERE
    SSTE
    0 0

    样例输出

    8
    解题思路:
    简单的BFS但是要用优先队列来做,普通的队列会出错(很重要),不过目前还没弄清楚出错的原因。

    具体代码:
    #include<iostream>
    #include<queue>
    #include<cstring>
    using namespace std;
    char map[305][305];
    int beginx,beginy;
    int m,n;
    int fangxiang[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    int res=9999999;
    //int min=1000000;
    struct Node
    {
        int x;
        int y;
        int step;
        Node (int x1,int y1,int step1):x(x1),y(y1),step(step1){}
    };
    bool operator < (const Node &a, const Node &b) //优先队列,队头为最优解。即花费最少
    {
        return a.step > b.step;
    }
    void bfs(int p,int q,int ste)
    {
        priority_queue<Node> qq;
        Node node(p,q,ste);
        while(!qq.empty()) qq.pop();
        qq.push(node);
        while(!qq.empty())
        {
            node=qq.top();
            qq.pop();
            if(map[node.x][node.y]=='T')
            {
                if(node.step<res)
                {
                    res=node.step;
                }
            }
            for(int i=0;i<4;i++)
            {
                int xx=node.x+fangxiang[i][0];
                int yy=node.y+fangxiang[i][1];
                if(xx>=1&&xx<=m&&yy>=1&&yy<=n&&(map[xx][yy]=='E'||map[xx][yy]=='B'||map[xx][yy]=='T'))
                {
                    if(map[xx][yy]!='T')
                    {
                        if(map[xx][yy]=='B')
                        {
                            map[xx][yy]='S';
                            Node test(xx,yy,node.step+2);
                            qq.push(test);
                        }
                        else if(map[xx][yy]=='E')
                        {
                            map[xx][yy]='S';
                            Node test(xx,yy,node.step+1);
                            qq.push(test);
                        }
                    }
                    else
                    {
                        Node test(xx,yy,node.step+1);
                        qq.push(test);
                    }
                }
            }
        }
    }
    int main()
    {
        while(1)
        {
            memset(map,0,sizeof(map));
            res=9999999;
            cin>>m>>n;
            if(m+n==0)
                break;
            else
            {
                for(int i=1;i<=m;i++)
                {
                    for(int j=1;j<=n;j++)
                    {
                        cin>>map[i][j];
                        if(map[i][j]=='Y')
                        {
                            beginx=i;
                            beginy=j;
                        }
                    }
                }
                bfs(beginx,beginy,0);
                if(res!=9999999)
                    cout<<res<<endl;
                else
                    cout<<-1<<endl;
    
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    一文带你彻底明白如何实现动态添加子节点及修改子节点属性
    一文带你彻底理解 JavaScript 原型对象
    Oracle内存占用高过时的调整策略
    Oracle Instant Client(即时客户端) 安装与配置
    windows环境完全卸载Oracle19c
    Oracle19c常用语句
    cannot mount database in EXCLUSIVE mode解决办法
    oracle存储过程通过游标输出Sql结果集
    Oracle DBlink的创建
    MySQL语法
  • 原文地址:https://www.cnblogs.com/baoluqi/p/3739618.html
Copyright © 2011-2022 走看看