HDU 3345 War Chess(bfs+优先队列)
来源:互联网 发布:php.cgi漏洞 编辑:程序博客网 时间:2024/06/15 06:41
http://acm.hdu.edu.cn/showproblem.php?pid=3345
题意:从起点开始向外走(上下左右) 开始时有一定的能量 进入不同的区域消耗不同的能量 能量为0不能继续行走 问可以停留在那些地方将这些地方标记为 " * "
"Y": 起点 不需要标记
".": 正常的格子 进入消耗1点能量
"T": 树 进入消耗2点能量
"R": 河 进入消耗3点能量
"#": 障碍 不能进入
"E" 敌人 不能进入 并且进入其附近(上下左右)的格子时会耗尽所有能量
"P" 朋友 进入消耗1点体力 但不能停留
输出标记后的地图
相对简单的 bfs+优先队列
代码如下:
#include <stdio.h>#include <cstring>#include <queue> using namespace std;char map[105][105];// 地图 int count[105][105];// 转换为能量消耗地图 int vis[105][105];int N,M,X;int x,y;int dir[4][2]={1,0,0,1,0,-1,-1,0};struct node{ int x;int y; int step; friend bool operator < (node a,node b){ return a.step<b.step; }};int judge0(int i,int j){ if(i<0||j<0||i>=N||j>=M||vis[i][j]||map[i][j]=='#'||map[i][j]=='E') return 0; return 1;}int judge1(int i,int j){ if(i<0||j<0||i>=N||j>=M) return 0; return 1;}int judge2(int i,int j){ for (int k=0;k<4;k++){ int a=i+dir[k][0]; int b=j+dir[k][1]; if (judge1(a,b)&&map[a][b]=='E'){ return 1; } } return 0;}void bfs(){ priority_queue<node> Q; node n1,n2; n1.x=x; n1.y=y; n1.step=X; Q.push(n1); while (!Q.empty()){ n2=Q.top(); Q.pop(); if (map[n2.x][n2.y]!='P'&&map[n2.x][n2.y]!='Y') map[n2.x][n2.y]='*'; for (int k=0;k<4;k++){ int i=n2.x+dir[k][0]; int j=n2.y+dir[k][1]; if (judge0(i,j)){ vis[i][j]=1; node next; next.x=i; next.y=j; if(n2.step>=count[i][j]){// 如果可以走到这一个区域(存在能量不足以走到这一区域的情况) next.step=n2.step-count[i][j]; if(judge2(i,j)){// 周围是否有敌人 next.step=-1; } if(next.step>=0||next.step==-1) Q.push(next); } } } } }int main (){ int t; scanf ("%d",&t); while (t--){ scanf ("%d%d%d",&N,&M,&X); getchar(); memset(map,0,sizeof(map)); for (int i=0;i<N;i++){ scanf ("%s",map[i]); } for (int i=0;i<N;i++){ for (int j=0;j<M;j++){ if (map[i][j]=='Y'){// 记住起点 x=i; y=j; } // 进行能量的转换 if(map[i][j]=='.'||map[i][j]=='P') count[i][j]=1; else if(map[i][j]=='T') count[i][j]=2; else if (map[i][j]=='R') count[i][j]=3; } } memset(vis,0,sizeof(vis)); vis[x][y]=1; bfs(); for (int i=0;i<N;i++){ printf("%s\n",map[i]); } putchar('\n'); } return 0;}
0 0
- HDU 3345 war chess(bfs + 优先队列)
- hdu 3345 War Chess (bfs+优先队列)
- HDU 3345 War Chess(bfs+优先队列)
- HDU 3345 War Chess (优先队列)
- War Chess (bfs + 优先队列)
- HDU3345:War Chess(BFS+优先队列)
- HDU3345:War Chess(BFS+优先队列)
- hdu 3345 War Chess(BFS+模拟)
- HDU 3345 War Chess (BFS)
- HDU 3345 War Chess BFS
- hdu 3345 War Chess(bfs)
- hdu 3345 War chess(bfs)
- hdu 3345 War Chess【bfs+优先级队列or状态标记】
- hdu 3345 War Chess(广搜,用不用优先队列都可以)
- hdoj 3345 War Chess (搜索,优先队列)
- hdu 3345 War Chess
- hdu 3345 war chess
- HDU 3345 War Chess
- 数据结构之单链表实现
- 2017 多校联合集训 问题 C: 瑞神要考研
- 解决Ubuntu安装VM Tools请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。
- Android中的事件分发、拦截、消费机制
- 2017 多校联合集训 问题 H: Envy
- HDU 3345 War Chess(bfs+优先队列)
- 特征工程(补充)--机器学习数据集里的不均衡数据问题
- 文件上传下载整理
- C/C++:递归的一个简单示例
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- HDU 5974 A Simple Math Problem(2016ACM/ICPC亚洲区大连站-重现赛 D题)
- 并查集详解
- EOJ 3256 拼音魔法 题解
- 快速幂