HDU 1026 BSF+优先队列+记录路径、
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
const int qq=110;
const int MAX=10000;
char map[qq][qq];
int pre[qq][qq];
int a[MAX],b[MAX];
int n,m;
int dir[5][2]={0,0,1,0,-1,0,0,1,0,-1}; // 走的顺序是右,左,下,上
struct Node
{
int x,y;
int pre; // 定义来源的方向 1左 2右 3上 4下
char mark; //是否存在怪兽
int time;
friend bool operator <(Node a,Node b)
{
return a.time>b.time;
}
};
priority_queue<Node>Q;
int check(int x,int y)
{
if(x<0||y<0||x>=n||y>=m) //判断是否越界
return 0;
if(pre[x][y]) // 判断是否走过这点
return 0;
if(map[x][y]=='X') // 判断是否是墙
return 0;
return 1;
}
void bfs()
{
Node ans,cns;
ans.x=0;ans.y=0;ans.pre=0;ans.time=0;ans.mark=map[0][0];
Q.push(ans);
while(!Q.empty()){
cns=Q.top();
Q.pop();
//printf("%d %d\n",cns.x,cns.y);
if(cns.x==n-1&&cns.y==m-1){
//printf("%d %d\n",cns.x,cns.y);
while(!Q.empty())
Q.pop();
Q.push(cns);
break;
}
for(int i=1;i<=4;++i){
ans.x=cns.x+dir[i][1];
ans.y=cns.y+dir[i][0];
if(check(ans.x,ans.y)){
ans.mark=map[ans.x][ans.y];
ans.pre=i;
pre[ans.x][ans.y]=i;
if(map[ans.x][ans.y]>='1'&&map[ans.x][ans.y]<='9')
ans.time=cns.time+1+(map[ans.x][ans.y]-'0');
else
ans.time=cns.time+1;
Q.push(ans);
}
}
}
return;
}
void out()
{
Node ans;
ans=Q.top();
Q.pop();
printf("It takes %d seconds to reach the target position, let me show you the way.\n",ans.time);
int r=1;
a[0]=ans.x;b[0]=ans.y;
int x=ans.x,y=ans.y;
//printf("%d %d\n",x,y);
while(x!=0||y!=0){ // x和y搞反了 调了两个小时、 真特么醉了
if(pre[x][y]==1)
y=y-1;
else if(pre[x][y]==2)
y=y+1;
else if(pre[x][y]==3)
x=x-1;
else if(pre[x][y]==4)
x=x+1;
a[r]=x;b[r++]=y;
// printf("%d %d\n",x,y);
}
int t=1;
for(int i=r-2;i>=0;--i){
printf("%ds:(%d,%d)->(%d,%d)\n",t++,a[i+1],b[i+1],a[i],b[i]);
if(map[a[i]][b[i]]>='1'&&map[a[i]][b[i]]<='9')
for(int j=0;j<map[a[i]][b[i]]-'0';++j)
printf("%ds:FIGHT AT (%d,%d)\n",t++,a[i],b[i]);
}
}
int main()
{
while(~scanf("%d %d",&n,&m)){
memset(pre,0,sizeof(pre));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;++i)
scanf("%s",map[i]);
bfs();
if(Q.empty()) printf("God please help our poor hero.\n");
else out();
printf("FINISH\n");
while(!Q.empty())
Q.pop();
}
return 0;
}
// 记录路径的数组开小了、又调了好久!!QAQ
HDU 1026 BSF+优先队列+记录路径、的更多相关文章
- hdu 1226 BFS + bfs记录路径
http://acm.hdu.edu.cn/showproblem.php? pid=1226 为了节省空间.您可以使用vis初始化数组初始化-1. 发现BFSeasy错了地方 始一直WA在这里:就是 ...
- hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)
以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要 ...
- hdu 1026 Ignatius and the Princess I (bfs+记录路径)(priority_queue)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1026 Problem Description The Princess has been abducted ...
- hdu 1026(优先队列+路径输出)
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1026 Ignatius and the Princess I(带路径的BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:给出一个迷宫,求出到终点的最短时间路径. 这道题目在迷宫上有怪物,不同HP的怪物会损耗不同的时间,这 ...
- hdu 1026 Ignatius and the Princess I 搜索,输出路径
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu 1026:Ignatius and the Princess I(优先队列 + bfs广搜。ps:广搜AC,深搜超时,求助攻!)
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu 1074(状态压缩dp+记录路径)
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...
- hdu 1664(数论+同余搜索+记录路径)
Different Digits Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- js里面的this指向
1. this是动态绑定的,或者说是在代码运行期绑定而不是在书写期 function fire () { console.log(this.a) } var obj = { a: 1, fire: ...
- C#中的事件注册和注销
C#中的事件注册和注销 由于.NET框架对消息循环机制进行了很好的封装,开发人员不再需要深入的了解Windows事件/消息实现的具体机制,也无需创建复杂的事件结构体和所谓的消息句柄.我们所要做的无非就 ...
- 利用CSS使footer固定在页面底部
1.HTML基本结构 <!DOCTYPEhtml> <htmlxmlns="http://www.w3.org/1999/xhtml"> <headr ...
- Direct2D 第4篇 渐变画刷
原文:Direct2D 第4篇 渐变画刷 #include <windows.h> #include <d2d1.h> #include <d2d1helper.h> ...
- [Vue CLI 3] @vue/cli-plugin-eslint 源码分析
熟悉 eslint-loader 的同学一般如下配置: 设置一下几项: test : A condition that must be met(一般是处理对应文件的正则) exclude : A co ...
- android非硬件加速绘制简单流程
这里的硬件加速是指openGL + GPU 如果不适用硬件加速: 1 ViewRootImpl.java draw:if (!dirty.isEmpty() || mIsAnimating || ac ...
- 微信端的user-Agent
在iPhone下,返回 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Ge ...
- objectarx之画多段线和画直线
void CCommonFuntion::DrowPloyLine(AcGePoint2dArray& inputpoints){ if (inputpoints.length() < ...
- css 的float和inline-block区别
CSS布局创建网站,浮动绝对占据了很大的比例.大块区域如主内容及侧边栏,以及在其中的小块区域,都可以看到浮动的影子.这里浮动是唯一的解决方案吗? 浮动通常表现正常,但有时候搞起来会很纠结.特别是处理内 ...
- C# 获取上传文件的文件名和后缀名
//获得要上传的文件 HttpPostedFile file = Request.Files[]; //获得到文件名 string fileName = System.IO.Path.GetFileN ...