hdu 3345 War Chess
War Chess
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 5 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
In this game, there is an N * M battle map, and every player has his own Moving Val (MV). In each round, every player can move in four directions as long as he has enough MV. To simplify the problem, you are given your position and asked to output which grids you can arrive.

In the map:
'Y' is your current position (there is one and only one Y in the given map).
'.' is a normal grid. It costs you 1 MV to enter in this gird.
'T' is a tree. It costs you 2 MV to enter in this gird.
'R' is a river. It costs you 3 MV to enter in this gird.
'#' is an obstacle. You can never enter in this gird.
'E's are your enemies. You cannot move across your enemy, because once you enter the grids which are adjacent with 'E', you will lose all your MV. Here “adjacent” means two grids share a common edge.
'P's are your partners. You can move across your partner, but you cannot stay in the same grid with him final, because there can only be one person in one grid.You can assume the Ps must stand on '.' . so ,it also costs you 1 MV to enter this grid.
Input
Then T cases follow:
Each test case starts with a line contains three numbers N,M and MV (2<= N , M <=100,0<=MV<= 65536) which indicate the size of the map and Y's MV.Then a N*M two-dimensional array follows, which describe the whole map.
Output
Sample Input
5
3 3 100
...
.E.
..Y 5 6 4
......
....PR
..E.PY
...ETT
....TT 2 2 100
.E
EY 5 5 2
.....
..P..
.PYP.
..P..
..... 3 3 1
.E.
EYE
...
Sample Output
...
.E*
.*Y ...***
..**P*
..E*PY
...E**
....T* .E
EY ..*..
.*P*.
*PYP*
.*P*.
..*.. .E.
EYE
.*. 自己写的spfa代码:
注意输出的每行后面都有一个空行,我就错了presentation error。。。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; struct node
{
int x,y;
node(int a,int b){x=a; y=b;}
};
int dr[][]={{,},{,},{-,},{,-}};
int n,m,mv,t,sx,sy;
int dis[][];
bool vis[][];
char mp[][]; bool work(int x,int y)
{
if(mp[x][y]=='Y') return ;
for(int i=;i<;i++)
{
int xx=x+dr[i][];
int yy=y+dr[i][];
if(xx< || xx>=n || yy< || yy>=m) continue;
if (mp[xx][yy]=='E') return ;
}
return ;
}
void spfa()
{
queue<node> Q;
memset(dis,-,sizeof(dis));
memset(vis,,sizeof(vis));
Q.push(node(sx,sy));
dis[sx][sy]=mv;
vis[sx][sy]=;
while(!Q.empty())
{
node p=Q.front();
vis[p.x][p.y]=;
Q.pop();
if (work(p.x,p.y)) dis[p.x][p.y]=;
if (dis[p.x][p.y]>)
for(int i=;i<;i++)
{
int xx=p.x+dr[i][];
int yy=p.y+dr[i][];
char ch=mp[xx][yy];
if(xx< || xx>=n || yy< || yy>=m) continue;
if(ch=='#') continue;
if(ch=='.'|| ch=='T' || ch=='R')
{
int k;
if (ch=='.') k=; else
if (ch=='T') k=; else
if (ch=='R') k=;
if (dis[xx][yy]>=dis[p.x][p.y]-k) continue;
dis[xx][yy]=dis[p.x][p.y]-k;
if(!vis[xx][yy])
{
Q.push(node(xx,yy));
vis[xx][yy]=;
}
}
if(ch=='P' && dis[p.x][p.y]>)
{
if (dis[xx][yy]>=dis[p.x][p.y]-) continue;
dis[xx][yy]=dis[p.x][p.y]-;
if(!vis[xx][yy])
{
Q.push(node(xx,yy));
vis[xx][yy]=;
}
}
}
}
}
int main()
{
scanf("%d",&t);
for(;t>;t--)
{
scanf("%d%d%d",&n,&m,&mv);
for(int i=;i<n;i++)
{
scanf("%s",&mp[i]);
for(int j=;j<m;j++)
if (mp[i][j]=='Y') sx=i,sy=j;
} spfa();
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if (dis[i][j]<) printf("%c",mp[i][j]);
else
{
if (mp[i][j]=='E' || mp[i][j]=='P' || mp[i][j]=='Y') printf("%c",mp[i][j]);
else printf("*");
}
}
printf("\n");
}
printf("\n");
}
return ;
}
转自:http://www.bkjia.com/cjjc/857812.html
/*
bfs+优先队列,刚开始没有优化,果断超时,第二次竟然因为优先级符号TLE!!(该记得的东西真得记牢) 使用mark数组记录该点MV值大小,初始化为零,搜索时只有当从某个点到达当前点使MV变大时才把该点值更新;入队时判断该点MV值是否大于零,大于则入队。 具体看代码:
*/
#include"stdio.h"
#include"string.h"
#include"queue"
#include"vector"
#include"algorithm"
using namespace std;
#define N 105
#define max(a,b) (a>b?a:b)
int mark[N][N],n,m,v;
int dir[][]={,,,-,-,,,};
char str[N][N];
struct node
{
int x,y,d;
friend bool operator<(node a,node b)
{
return a.d=&&x=&&yq;
node cur,next;
cur.x=x;cur.y=y;cur.d=v;
q.push(cur);
memset(mark,-,sizeof(mark));
mark[x][y]=v;
while(!q.empty())
{
cur=q.top();
q.pop();
for(i=;i<;i++)
{
next.x=x=dir[i][]+cur.x;
next.y=y=dir[i][]+cur.y;
if(judge(x,y))
{
if(str[x][y]=='.'||str[x][y]=='P')
t=cur.d-;
else if(str[x][y]=='T')
t=cur.d-;
else if(str[x][y]=='R')
t=cur.d-;
else
t=-;
if(ok(x,y)&&t>)
t=; //战斗力减为0
if(t>&&t>mark[x][y])
{
next.d=t;
q.push(next);
}
mark[x][y]=max(mark[x][y],t);
}
}
}
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&v);
for(i=;i=)
{
if(str[i][j]!='P'&&str[i][j]!='Y')
printf("*");
else
printf("%c",str[i][j]);
}
else
printf("%c",str[i][j]);
}
puts("");
}
puts("");
}
return ;
}
hdu 3345 War Chess的更多相关文章
- HDU - 3345 War Chess 广搜+优先队列
War chess is hh's favorite game: In this game, there is an N * M battle map, and every player has hi ...
- 【HDOJ】3345 War Chess
简单BFS.注意最后一组数据,每个初始点不考虑周围是否有敌人. /* 3345 */ #include <iostream> #include <cstdio> #includ ...
- War Chess (hdu 3345)
http://acm.hdu.edu.cn/showproblem.php?pid=3345 Problem Description War chess is hh's favorite game:I ...
- hihoCoder 1392 War Chess 【模拟】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
#1392 : War Chess 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Rainbow loves to play kinds of War Chess gam ...
- War Chess bfs+优先队列
War chess is hh's favorite game: In this game, there is an N * M battle map, and every player has hi ...
- HDU 5724:Chess(博弈 + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5724 Chess Problem Description Alice and Bob are playing ...
- HDU 4405 Aeroplane chess 期望dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4405 Aeroplane chess Time Limit: 2000/1000 MS (Java/ ...
- HDU 3345
http://acm.hdu.edu.cn/showproblem.php?pid=3345 最近重写usaco压力好大,每天写的都想吐.. 水一道bfs 注意的是开始旁边有敌人可以随便走,但是一旦开 ...
- HDU 4405 Aeroplane chess 概率DP 难度:0
http://acm.hdu.edu.cn/showproblem.php?pid=4405 明显,有飞机的时候不需要考虑骰子,一定是乘飞机更优 设E[i]为分数为i时还需要走的步数期望,j为某个可能 ...
随机推荐
- EnumPrinters用法
看API描述,不怎么理解,还是在网上找到用法,记载一下: 1: DWORD dwNeeded = 0, dwNum = 0; 2: EnumPrinters(PRINTER_ENUM_LOCAL, N ...
- 【其他】MySql数据库的安装与卸载
一.安装 1.首先下载安装包,包含服务端和客户端 2.添加用户组.用户 secondary1:~ # groupadd mysql secondary1:~ # useradd -g mysql -d ...
- redis数据类型:sets
sets类型及操作: set是集合,它是string类型的无序集合.set是通过hash table实现的, 添加.删除和查找的复杂度都是O(1).对集合我们可以取并集.交集.差集. 通过这些操作我们 ...
- Copy Constructor的构造操作
Copy Constructor的构造操作 有三种情况,会以一个object的内容作为另一个class object的初值: 1. 对一个object做显式的初始化操作 class X{…}; X ...
- 《Windows驱动开发技术详解》之驱动程序的基本结构
驱动对象 每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候被内核中的对象管理程序所创建的.驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并 ...
- 使用 VirtualBox 虚拟机在电脑上运行 Android 4.0 系统,让电脑瞬间变安卓平板
Ref: http://www.iplaysoft.com/android-v4-ics-for-virtualbox.html 随着 Android 手机的各种软件应用越来越多,很多没有购买的朋友都 ...
- XBOX360 硬盘玩游戏
首先PC端需要到flashFXP这个软件,因为级别不够上传不了就发个下载网站各位自己下一下吧.http://www.oyksoft.com/soft/14875.html#oyksoftdown 好了 ...
- js 数组切换图片
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- apache:添加cgi模式
最终期望:通过配置apache的cgi能够使得apache能通过cgi方式连接go程序(因为我们的后端程序是用go语言写的). 实验1: 期望:通过配置cgi使得应用程序能够跑起来. go代码: pa ...
- repeat帮定删除按钮事件,并且生成去人删除提示
前台 <ItemTemplate> <tr> <td> <asp:LinkButton ID="LinkButton_cancel" On ...