[HDOJ 3638] Go , SuSu [模拟]

来源:互联网 发布:软件许可使用权证书 编辑:程序博客网 时间:2024/06/03 09:45

在一个n*m的地图上(50*50),你要从点A走到点B,你可以在每个单位时间移动一个格子,也可以不移动。

地图上的格子分为可以行走的格子,和不可以行走的墙。

地图上还有k只怪物(50只),每个怪物可以看到自己前方的一块面积为9的区域。

怪物会每秒向前移动一个格子,如果碰到了墙壁或者走到了地图边缘,就会转身。

问你能否在1000秒内从A走到B,并且不被任何怪物看见?


解法:直接模拟即可,使用一个1000*50*50的数组记录每个时间点能否走到地图上的每个格子。然后再在每个时间点处理一下,将怪物能够看到的格子设定为不能走到。

复杂度:1000*50*50*5+1000*50*9


#include <cstdio>const int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};char s[50][51];int n,m,k;inline bool in(int x,int y) {return x>=0&&x<n&&y>=0&&y<m&&s[x][y]!='*';}inline void putfalse(bool a[50][50],int x,int y) {if (in(x,y)) a[x][y]=false;}inline void puttrue(bool a[50][50],int x,int y) {if (in(x,y)) a[x][y]=true;}struct Monster {int x,y,d;void read() {scanf("%d%d%d",&x,&y,&d);x--;y--;d--;}void move() {x+=dir[d][0];y+=dir[d][1];if (!in(x,y)) {x-=dir[d][0];y-=dir[d][1];d^=1;}}void check(bool a[50][50]) {int x1=dir[d][0],y1=dir[d][1];int x2=dir[d^2][0],y2=dir[d^2][1];int x3=dir[d^3][0],y3=dir[d^3][1];putfalse(a,x,y);putfalse(a,x+x1,y+y1);putfalse(a,x+x1+x2,y+y1+y2);putfalse(a,x+x1+x3,y+y1+y3);putfalse(a,x+x1+x1,y+y1+y1);putfalse(a,x+x1+x1+x2,y+y1+y1+y2);putfalse(a,x+x1+x1+x3,y+y1+y1+y3);putfalse(a,x+x1+x1+x2+x2,y+y1+y1+y2+y2);putfalse(a,x+x1+x1+x3+x3,y+y1+y1+y3+y3);}};Monster a[50];bool can[1001][50][50];int cal() {for (int i=0;i<=1000;i++)for (int x=0;x<n;x++)for (int y=0;y<m;y++)can[i][x][y]=false;for (int x=0;x<n;x++)for (int y=0;y<m;y++)if (s[x][y]=='A') can[0][x][y]=true;for (int i=0;i<=1000;i++) {for (int j=0;j<k;j++)a[j].check(can[i]);for (int x=0;x<n;x++)for (int y=0;y<m;y++)if (s[x][y]=='B'&&can[i][x][y]) return i;if (i==1000) return -1;for (int j=0;j<k;j++)a[j].move();for (int x=0;x<n;x++)for (int y=0;y<m;y++)if (can[i][x][y]) {puttrue(can[i+1],x,y);puttrue(can[i+1],x+1,y);puttrue(can[i+1],x-1,y);puttrue(can[i+1],x,y+1);puttrue(can[i+1],x,y-1);}}return -1;}int main() {int t,tt,i;scanf("%d",&t);for (tt=1;tt<=t;tt++) {scanf("%d%d",&n,&m);for (i=0;i<n;i++) scanf("%s",s[i]);scanf("%d",&k);for (i=0;i<k;i++) a[i].read();int ans=cal();if (ans==-1) printf("Case %d: 胜败兵家事不期 卷土重来是大侠\n",tt);else printf("Case %d: %d\n",tt,ans);}return 0;}


0 0
原创粉丝点击