博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PKU 3669 Meteor Shower(BFS)
阅读量:7091 次
发布时间:2019-06-28

本文共 1896 字,大约阅读时间需要 6 分钟。

题目描述:

        题意是在某一时刻t会有一个陨石落下来,会落到坐标为x,y的地方,陨石落下来之后不但x,y会遭到破坏,和x,y四邻接的点也会被破坏。现在Bessie的初始位置在原点,每一个单位时间只能平行于坐标轴,移动一个单位距离,题目要求需要几个单位时间Bessie才能移动到安全的地方(只能运动在坐标轴和第一象限)。由于陨石落下来之前,某个点还是可以走的,直到t时刻陨石落下来破坏掉该点。

 

        明确题意后首先想到的是BFS,预处理是这题的难点,由于某个点遭到破坏后就不能走了,因此如果有多次遭破坏只要记录改点遭破坏的最早的时间就可以了。bfs的时候如果移动步数大于等于该点被破坏的时间,那么该节点就不能被扩展。直到走到不会被陨石破坏的点为止。

 

代码如下:

        数组mp记录了每个点被陨石破坏的最早时间,如果不会被破坏则用-1表示(由于题目中t可以是0,因此不能用0表示不会被破坏,在这里wa了一次)

 

#include 
#include
#include
#include
using namespace std;int mp[309][309];int dir[4][2] = {
{1,0}, {-1,0}, {0,-1}, {0,1}};int visit[309][309];struct State{ int x, y, step; State(int x, int y, int step) : x(x), y(y), step(step) {}};bool inFirstQuadrant( int x, int y ){ if ( x >= 0 && y >= 0 ) return true; return false;}void setPoint(int x, int y, int t){ if ( mp[x][y] == -1 ) mp[x][y] = t; else mp[x][y] = min(mp[x][y], t);}void destroyPoint( int x, int y, int t ){ setPoint(x, y, t); for ( int i=0; i<4; i++ ) { int tx = x + dir[i][0]; int ty = y + dir[i][1]; if ( inFirstQuadrant( tx, ty ) ) setPoint( tx, ty, t ); }}void BFS(){ State origin( 0, 0, 0 ); queue
Q; Q.push( origin ); visit[0][0] = 1; while( ! Q.empty() ) { State cur = Q.front(); Q.pop(); if ( mp[cur.x][cur.y] == -1 ) { cout << cur.step << endl; return; } for ( int i=0; i<4; i++ ) { int x = cur.x + dir[i][0]; int y = cur.y + dir[i][1]; if ( inFirstQuadrant(x, y) && !visit[x][y]) { if ( cur.step + 1 < mp[x][y] || mp[x][y] == -1) { State p( x, y, cur.step + 1 ); Q.push( p ); visit[x][y] = 1; } } } } cout << -1 << endl;}int main(){ int m; while ( cin >> m ) { memset( mp, -1, sizeof(mp) ); memset( visit, 0, sizeof(visit) ); int x, y, t; for ( int i=0; i
> x >> y >> t; destroyPoint( x, y, t ); } BFS(); } return 0;}

 

转载于:https://www.cnblogs.com/JackieZhu/p/4190453.html

你可能感兴趣的文章
.Net下一个Winform方案可以让MessageBox.Show它显示在父窗口的中间
查看>>
【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成
查看>>
关于Patter类和Match类
查看>>
Linux下iptables的简介和自己的记录
查看>>
类的operator new与operator delete的重载
查看>>
tn文本分析语言(三):高级语法
查看>>
iOS:提示框(警告框)控件UIActionSheet的详解
查看>>
分析Linux内核创建一个新进程的过程【转】
查看>>
Web API应用架构设计分析(2)
查看>>
.NET插件系统之二——不实例化获取插件信息和可视化方法
查看>>
让asp.net默认的上传组件支持进度条反映
查看>>
EXTJS学习系列提高篇:第十一篇(转载)作者殷良胜,制作树形菜单之五
查看>>
从代码分析Android-Universal-Image-Loader的图片加载、显示流程
查看>>
阿里妈妈首次公开新一代自研智能检索模型 | WWW 2018论文解读
查看>>
使用Depth Texture
查看>>
第 9 章 PBX
查看>>
ylbtech-LanguageSamples-Porperties(属性)
查看>>
第 4 章 Music score
查看>>
架构设计目录
查看>>
Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
查看>>