博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku 2049 Finding Nemo 第一周训练——搜索
阅读量:4582 次
发布时间:2019-06-09

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

好纠结的一道题,刚拿过体来就已经懵了。这个图的信息到底该怎么存啊。。。纠结。看了别人的思路才A的。。

he,ve两个数组分别存放这平行于x轴,y轴的墙,门信息。。。

dis存储到达该点的最端距离。

View Code
#include 
#include
#include
#define maxn 250 #define inf 999999999 using namespace std; struct node//优先队列的写法 {
int x,y; int len; bool operator < (const node &a) const {
return len > a.len; } }; int n,m,sx,sy; int dis[maxn][maxn],he[maxn][maxn],ve[maxn][maxn]; priority_queue
q; int xmax,ymax; void bfs() {
int x,y; for (x = 0; x <= xmax; ++x) {
for (y = 0; y <= ymax; ++y) dis[x][y] = inf; } while (!q.empty()) q.pop(); node pn; pn.x = 0; pn.y = 0; pn.len = 0; dis[0][0] = 0; q.push(pn); while (!q.empty()) {
pn = q.top(); q.pop(); x = pn.x; y = pn.y; if (x == sx && y == sy) return ; //向上走 if (y + 1 <= ymax && dis[x][y + 1] > dis[x][y] + he[x][y + 1]) {
dis[x][y + 1] = dis[x][y] + he[x][y + 1]; pn.x = x; pn.y = y + 1; pn.len = dis[x][y + 1]; q.push(pn); } //向下走 if (y - 1 >= 0 && dis[x][y - 1] > dis[x][y] + he[x][y]) {
dis[x][y - 1] = dis[x][y] + he[x][y]; pn.x = x; pn.y = y - 1; pn.len = dis[x][y - 1]; q.push(pn); } //向左走 if (x - 1 >= 0 && dis[x - 1][y] > dis[x][y] + ve[x][y]) {
dis[x - 1][y] = dis[x][y] + ve[x][y]; pn.x = x - 1; pn.y = y; pn.len = dis[x - 1][y]; q.push(pn); } //向右走 if (x + 1 <= xmax && dis[x + 1][y] > dis[x][y] + ve[x + 1][y]) {
dis[x + 1][y] = dis[x][y] + ve[x + 1][y]; pn.x = x + 1; pn.y = y; pn.len = dis[x + 1][y]; q.push(pn); } } dis[sx][sy] = -1; } int main() {
int x,y,d,t,i,j; double tx,ty; while (scanf("%d%d",&n,&m)) {
xmax = ymax = - 1;//记录最大x,与y memset(he,0,sizeof(he)); memset(ve,0,sizeof(ve)); if (n == -1 && m == -1) break; for (i = 0; i < n; ++i) {
scanf("%d%d%d%d",&x,&y,&d,&t); if (d == 0) {
for (j = 0; j < t; ++j) he[x + j][y] = inf; xmax = max(xmax,x + t); ymax = max(ymax,y); } else {
for (j = 0; j < t; ++j) ve[x][y + j] = inf; xmax = max(xmax,x); ymax = max(ymax,y + t); } } for (i = 0; i < m; ++i) {
scanf("%d%d%d",&x,&y,&d); if (d == 0) {
he[x][y] = 1; } else {
ve[x][y] = 1; } } scanf("%lf%lf",&tx,&ty); if (tx > xmax || ty > ymax) {
puts("0"); } else {
sx = (int)tx; sy = (int)ty; bfs(); printf("%d\n",dis[sx][sy]); } } return 0; }

转载于:https://www.cnblogs.com/E-star/archive/2012/03/01/2376176.html

你可能感兴趣的文章
PostgreSQL的case when
查看>>
(转载)虚幻引擎3--【UnrealScript教程】章节一:4.代码的注释
查看>>
如何阅读他人的程序代码
查看>>
Maven使用教程
查看>>
《Java并发编程实战》第八章 线程池的使用 读书笔记
查看>>
Excel中mod函数的使用方法
查看>>
Nginx 添加 PHP 支持
查看>>
stray '\343' in program 编译错误
查看>>
生成网站,如何不生成.pdb文件?
查看>>
互联网项目管理要点
查看>>
WPF,Silverlight与XAML读书笔记第三十二 - 可视化效果之布局定位
查看>>
MapReduce入门小例子
查看>>
纪中2016.10.29比赛总结
查看>>
jzoj100048. 紧急撤离
查看>>
令人疑惑的 std::remove 算法
查看>>
Int..的范围
查看>>
HDU 2585 [Hotel]字符串递归处理
查看>>
ffmpeg 编码h264 profile如何设置为baseline的问题
查看>>
CSharper 学Quick-Cocos2d-X (一) 开发环境的搭建
查看>>
PoolThreadCache
查看>>