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,后来是最后路径打印输出的地方犯了点错误。

时间: 2024-10-22 17:47:16

hd 1026的相关文章

怎么用HD Tune检测硬盘坏道

HD Tune软件不仅小巧而且很易使用,是一款检测电脑硬盘的优良工具.不仅是电脑硬盘,包括移动硬盘在内一样可以检测.那么,如何使用HD Tune呢?如何使用HD Tune检测磁盘坏道呢? 工具/原料 HD Tune软件一枚 使用HD Tune检查硬盘坏道 1.百度搜索下载HD Tune软件,注意:尽量选择系统之家官网上下载这类软件,因为系统之家上的软件不会捆绑的流氓软件 2.软件打开之后,界面如图,最上方显示硬盘的厂家信息,图示红色遮挡区 3.点击选项卡切换至错误扫描,如图,然后在红框位置,尽量

1026. 程序运行时间(15)

1026. 程序运行时间(15) 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tick,即"时钟打点".同时还有一个常数CLK_TCK,给出了机器时钟每秒所走的时钟打点数.于是为了获得一个函数f的运行时间,我们只要在调用f之前先调用clock(),获得一个时钟打点数C1:在f执行完成后再调用clock(),获得另一个时钟打点数C2:两次获得的时钟打

bzoj 1026

很久以前做过的一道数位DP,现在用一种新的解决数位DP的比较一般的方法. 数位DP裸题是:求[L,R]有多少个数. 先转化成求[0,R]有多少个数,然后区间相减即可. 对于[0,R]中的所有数,用0补齐前面的空位,使得每个数的长度都为R的长度. 状态: dp[pos][0]表示从最高位到pos位,没有顶上界的数的个数 dp[pos][1]表示从最高位到pos位,顶到上界的数的个数(好吧,这个问题中,它一定为1) 然后考虑转移, dp[pos][0]->dp[pos-1][0](通过枚举pos-1

uva 12452 Plants vs. Zombies HD SP (树DP)

Problem I: Plants vs. Zombies HD Super Pro Plants versus Zombies HD Super Pro is a game played not a grid, but on a connected graph G with no cycles (i.e., a tree). Zombies live on edges of the tree and chew through edges so that tree falls apart! Pl

HDU 1026 Ignatius and the Princess I (基本算法-BFS)

Ignatius and the Princess I Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166's castle. The castle is a large labyrinth. To make the problem si

OSX: 解决10.10 Yosemite Developer Preview 2安装后的Recovery HD看不见的问题

OS X 10.10 Yosemite Developer Preview 2,下面简称10.10DP2,安装之后,有可能出现10.10的恢复盘(Recovery HD)看不见的问题.这是因为它的一个设置错误,下面我们用比较直观的方法来解决它. 这是修复后的启动选项,其中显示的Recovery-10.10 清楚点的 首先,开启磁盘工具的Debug菜单. 无论是从哪个磁盘启动,都可以操作,运行下面命令: defaults write com.apple.DiskUtility DUDebugMen

bzoj 1026 [SCOI2009]windy数(数位DP)

1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4550  Solved: 2039[Submit][Status][Discuss] Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数. Sample

WIKIOI 1026 逃跑的拉尔夫 深度优先搜索

/* 1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程序,通过使用一张小镇的地图帮助警察局找到那辆车.程序必须能表示出该车最终所有可能的位置. 小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行.“.”表示小镇

Radeon HD 7850 vs Radeon R9 270X

Radeon HD 7850 vs Radeon R9 270X HW compare Intro The Radeon HD 7850 comes with a GPU core speed of 860 MHz, and the 2048 MB of GDDR5 RAM runs at 1200 MHz through a 256-bit bus. It also is made up of 1024 SPUs, 64 Texture Address Units, and 32 Raster