博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC日记——逃出克隆岛 (bfs)
阅读量:4456 次
发布时间:2019-06-08

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

2059 逃出克隆岛

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 
Description

oi小组的yh酷爱玩魔兽rpg,每天都会在u9搜索最新的rpg地图。

今天,他找到一张名为《逃出克隆岛》的地图,在这张地图中,有一个n行m列的矩阵,矩阵由’Y’,’C’,’#’,’*’,’P’,5种元素组成。’Y’表示yh的出生位置,C表示克隆岛的出口,’#’表示该处不可通过,’*’表示通过该处需要消耗金币cost,’P’表示传送阵,任意两个传送阵之间可以免费互相传送。由于这仅仅是第一关,yh不想浪费太多的体力,聪明的你能帮他算出从’Y’出发到’C’最少需要消耗多少金币吗?当然,如果yh永远无法到达’C’,请输出” screw you!”以表到yh的不满。

输入描述 
Input Description

第一行两个整数,n,m,表示矩阵有n行m列

接下来为n行m列的矩阵,由’Y’,’C’,’#’,’*’,’P’,组成,含义如题目描述。

输出描述 
Output Description

输出1行,表示yh需要花费的最小体力(如果无法到达输出”screw you!”)。

样例输入 
Sample Input

【样例输入1】

1 3 3

Y*C

【样例输入2】

1 3 2

Y#C

【样例输入3】

1 5 2

YP#PC

样例输出 
Sample Output

【样例输出1】

3

【样例输出2】

screw you!

【样例输出3】

0

数据范围及提示 
Data Size & Hint

【数据范围】

对于100%的数据,n*m≤5000,传送阵’P’的数量≤500

 

 

思路:

  暴力bfs强行ac

 

来,上代码:

#include
#include
#include
#include
using namespace std;struct node { int x,y,dis;};struct node cur_1,cur_2,cur_3;const int dx[5]={
0,-1,0,1,0};const int dy[5]={
0,0,1,0,-1};int n,m,p,num_P=0,px[510],py[510],ex,ey,sx,sy;int pd[5010][5010];char map[1010][1010];queue
que;void bfs(){ memset(pd,127/3,sizeof(pd)); cur_1.x=sx,cur_1.y=sy,cur_1.dis=0; que.push(cur_1); pd[sx][sy]=0; while(!que.empty()) { cur_1=que.front(); que.pop(); for(int i=1;i<=4;i++) { if(cur_1.x+dx[i]>0&&cur_1.x+dx[i]<=n&&cur_1.y+dy[i]>0&&cur_1.y+dy[i]<=m) { if(map[cur_1.x+dx[i]][cur_1.y+dy[i]]=='#') continue; if(pd[cur_1.x+dx[i]][cur_1.y+dy[i]]<=cur_1.dis) continue; pd[cur_1.x+dx[i]][cur_1.y+dy[i]]=cur_1.dis; cur_2.x=cur_1.x+dx[i],cur_2.y=cur_1.y+dy[i],cur_2.dis=cur_1.dis; if(map[cur_1.x+dx[i]][cur_1.y+dy[i]]=='*') { cur_2.dis+=p; que.push(cur_2); } if(map[cur_2.x][cur_2.y]=='P') { que.push(cur_2); for(int j=1;j<=num_P;j++) { if(pd[px[j]][py[j]]<=cur_2.dis) continue; pd[px[j]][py[j]]=cur_2.dis; cur_3.x=px[j],cur_3.y=py[j],cur_3.dis=cur_2.dis; que.push(cur_3); } } if(map[cur_2.x][cur_2.y]=='Y'||map[cur_2.x][cur_2.y]=='C') que.push(cur_2); } } }}int main(){ scanf("%d%d%d",&n,&m,&p); for(int i=1;i<=n;i++) { scanf("%s",map[i]+1); for(int j=1;j<=m;j++) { if(map[i][j]=='P') px[++num_P]=i,py[num_P]=j; if(map[i][j]=='C') ex=i,ey=j; if(map[i][j]=='Y') sx=i,sy=j; } } bfs(); if(pd[ex][ey]>100000) printf("screw you!\n"); else printf("%d\n",pd[ex][ey]); return 0;}

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6066167.html

你可能感兴趣的文章
APP兼容性测试(三)测试方案设计
查看>>
leetcode 412. Fizz Buzz
查看>>
对Netflix Ribbon的Loadbalancer类源码设计合理性的一点质疑
查看>>
关于日历的算法
查看>>
[QT编程]QT实现的一个渐隐渐显窗体
查看>>
在Web工程中引入Jquery插件报错解决方案
查看>>
大学总结之影响我最深的十本书
查看>>
用myEclipse连接数据源生成动态数据报表
查看>>
[myeclipse]@override报错问题
查看>>
자주 쓰이는 정규표현식
查看>>
超简单的listview单选模式SingleMode(自定义listview item)
查看>>
vue-11-路由嵌套-参数传递-路由高亮
查看>>
HDU 1199 - Color the Ball 离散化
查看>>
[SCOI2005]骑士精神
查看>>
Hibernate原理解析-Hibernate中实体的状态
查看>>
六时车主 App 隐私政策
查看>>
C语言常见问题 如何用Visual Studio编写C语言程序测试
查看>>
Web用户的身份验证及WebApi权限验证流程的设计和实现
查看>>
hdu 2098 分拆素数和
查看>>
[ONTAK2010]Peaks kruskal重构树,主席树
查看>>