hd 1026

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hd 1026相关的知识,希望对你有一定的参考价值。

思路是广度优先搜索+优先队列+路径打印

优先队列详见:http://www.cnblogs.com/luosuo10/p/5194788.html

#include <iostream>
#include<ctype.h>
#include <queue>
using namespace std;
int sx,sy,gx,gy,n,m;
const int inf=99999;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int road_t;
#define judge(x,y) 0<=x&&x<n&&0<=y&&y<m
struct P
{
    int x,y,t;
    char data;
    int prex,prey;
    bool operator <(const P&a)const //这么多const
    {
        return a.t<t;
    }
}map[105][105];

int bfs()
{
    priority_queue<P>que;
    P p;

    map[sx][sy].t=0;
    que.push(map[sx][sy]);

    while(que.size())
    {
        p=que.top();
        que.pop();

        if(p.x==gx&&p.y==gy) {break;}

        for(int i=0;i<4;i++)
        {
            int nx=p.x+dx[i];
            int ny=p.y+dy[i];
            if(judge(nx,ny))
            {
                if(map[nx][ny].data==‘.‘&&map[nx][ny].t>p.t+1)
                {
                    map[nx][ny].t=p.t+1;
                    map[nx][ny].prex=p.x;map[nx][ny].prey=p.y;
                    que.push(map[nx][ny]);

                }
                else if(isdigit(map[nx][ny].data)&& map[nx][ny].t>p.t+map[nx][ny].data-‘0‘)//isdigit***
                //else if(map[nx][ny].data!=‘X‘&&map[nx][ny].t>p.t+map[nx][ny].data-‘0‘)//*****
                {
                    map[nx][ny].t=p.t+map[nx][ny].data-‘0‘+1;//到达 1s  然后打怪兽n秒
                    map[nx][ny].prex=p.x;map[nx][ny].prey=p.y;
                    que.push(map[nx][ny]);
                }
            }
        }
    }
    return map[gx][gy].t;

}
void print(P p)
{
    if(p.prex!=sx||p.prey!=sy)
    {
        print(map[p.prex][p.prey]);
    }
    ++road_t;
    cout<<road_t<<"s:("<<p.prex<<","<<p.prey<<")->("<<p.x<<","<<p.y<<")"<<endl;
    while(road_t!=p.t)
    {
        road_t++;
        cout<<road_t<<"s:FIGHT AT ("<<p.x<<","<<p.y<<")"<<endl;
    }



}
int main()
{
    while(cin>>n>>m)
    {
        sx=0;sy=0;
        gx=n-1;gy=m-1;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                cin>>map[i][j].data;
                map[i][j].t=inf;
                map[i][j].x=i;//*************一开始这里没输入这两个数据 觉得没用 但是 在判断是否到达终点时用到了 所以没有
                map[i][j].y=j;
            }
        //output
        if(bfs()==inf)
        {
            cout<<"God please help our poor hero."<<endl;
        }
        else
        {
            cout<<"It takes "<<bfs()<<" seconds to reach the target position, let me show you the way."<<endl;
            road_t=0;
            print(map[gx][gy]);
            //print();
        }

        cout<<"FINISH"<<endl;

    }


    return 0;
}

①优先队列里面,结构体的运算符重载:

bool operator <(const P&a)const //这么多const
    {
        return a.t<t;
    }

②关于这个时间记录的方法:

因为一开始都是inf,只要有路径有过那个点,时间必然小于inf能记录下来,然后搜索过程中不断记录更小的时间,就是最短路径了。

#include<ctype.h>
if(isdigit(map[nx][ny].data)&& map[nx][ny].t>p.t+map[nx][ny].data-‘0‘)

③利用这个prex和prey来记录路径,最后是一个路径打印。

犯错的地方是一开始没有x和y,后来是最后路径打印输出的地方犯了点错误。

以上是关于hd 1026的主要内容,如果未能解决你的问题,请参考以下文章

参考代码1021-1026

bzoj1026 SCOI2009—windy数

BZOJ1026 [SCOI2009]windy数 数位dp

HDU1026

Pat(Advanced Level)Practice--1026(Table Tennis)

poj1026