POJ 1924 The Treasure
2013-07-13 20:30
113 查看
题目大意:在一个N*M的地图里。P要去找宝藏T,地图上有好多怪物呀好多怪物。怪物有友善的,有不友善的。那些什么怪物啊吊炸天,每秒钟都会瞬移。逮到P了就吃掉了吃掉了。只要靠近不友好种类的四周都会被吃掉。那些友好的就不惹他就行了。
思路:首先对地图进行预处理,把每个时间的怪物的攻击范围区域都当做石头。然后进行BFS~。此处拜谢 吉吉 ~么么哒~
思路:首先对地图进行预处理,把每个时间的怪物的攻击范围区域都当做石头。然后进行BFS~。此处拜谢 吉吉 ~么么哒~
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <algorithm> using namespace std; int v[130][130][130]; int map[130][130][130]; int dx[9] = {0,-1,1,0,0,-1,1,-1,1};//8 上下左右 右上 右下 左上 左下 int dy[9] = {0,0,0,-1,1,1,1,-1,-1}; int n,m,tot; int cnt; int tagx,tagy; bool flag; struct mon { int state; int len; int ax[130]; int ay[130]; }mst[130]; struct node { int x,y,time; }; void bfs(node t) { queue<node>Q; node w,e; w=t; Q.push(w); while(!Q.empty()) { w=Q.front(); Q.pop(); if(w.time >= 100) break; for(int k=0;k<=16;k++) { e=w; e.time = w.time + 1; if(map[e.time][e.x][e.y]==0)continue; //么么哒 题目中说怪物先走,首先就判断怪物走完了之后能不能吃到。都吃到了还搞什么啊。 flag=false; if(k<=8) //前9个方向是WALK { int xx=e.x + dx[k]; int yy=e.y + dy[k]; if(xx<=0 || yy<=0 || xx>100 || yy>100)continue; if(map[e.time][xx][yy]!=0 && v[e.time][xx][yy]==0) { flag=true; e.x=xx; e.y=yy; v[e.time][xx][yy]=1; if(xx==tagx && yy==tagy){printf("%d\n",e.time);return;} } } else//后面就走两步 当做跑 { int xx=e.x + dx[k-8]; int yy=e.y + dy[k-8]; int xxx=xx + dx[k-8]; int yyy=yy + dy[k-8]; if(xxx <=0 || yyy<=0 || xxx>100 || yyy>100) continue; if(map[e.time][xx][yy]!=0 && map[e.time][xxx][yyy]!=0 && v[e.time][xxx][yyy]==0)//要判断走的路上都可以通过 { flag=true; e.x=xxx; e.y=yyy; v[e.time][xxx][yyy]=1; if(xxx==tagx && yyy==tagy){printf("%d\n",e.time);return;} } } if(flag) { Q.push(e); } } } printf("impossible\n"); } int main() { int CS=1; while(scanf("%d%d",&n,&m)!=EOF && n && m) { getchar(); cnt=1; node t; char ch[130]; memset(map,0,sizeof(map)); memset(v,0,sizeof(v)); for(int i=1;i<=n;i++) { scanf("%s",ch); //再也不用getchar()读入了 坑了一天的RE。 再用getchar剁手!作死。 for(int j=1;j<=m;j++) { if(ch[j-1]=='#')map[0][i][j]=0; else if(ch[j-1]=='.')map[0][i][j]=1; else if(ch[j-1]=='t') { map[0][i][j]=1; tagx=i; tagy=j; } else if(ch[j-1]=='p') { map[0][i][j]=1; t.x=i; t.y=j; v[0][i][j]=1; } else if(ch[j-1]=='a') { map[0][i][j]=1; mst[cnt++].state=1; } else if(ch[j-1]=='n') { map[0][i][j]=1; mst[cnt++].state=0; } } } for(int p=0;p<=102;p++) for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) map[p][i][j]=map[0][i][j]; } scanf("%d",&tot); int k; for(int i=1;i<=tot;i++) { scanf("%d",&k); mst[i].len=k; for(int j=0;j<k;j++) scanf("%d%d",&mst[i].ax[j],&mst[i].ay[j]); if(!mst[i].state) { for(int p=0;p<=102;p++) { map[p][mst[i].ax[p%mst[i].len]][mst[i].ay[p%mst[i].len]]=0; } } else { for(int p=0;p<=102;p++) for(int s=0;s<=8;s++) map[p][mst[i].ax[p%mst[i].len]+dx[s]][mst[i].ay[p%mst[i].len]+dy[s]]=0; } } t.time=0; if(CS>1)puts(""); CS++; bfs(t); //putchar(10); } return 0; }
相关文章推荐
- POJ1924----The Treasure----BFS
- poj 1924 Paths on a Grid(组合数学)
- POJ 3268水水水 标记一下
- POJ 2312 Battle City 优先队列+BFS
- poj-1152 An Easy Problem!
- POJ-1521 Entropy 赫夫曼编码
- POJ-1316
- poj1005---I Think I Need a Houseboat
- poj 4604 Deque-----2013多校联合赛第一场--1005
- POJ 2993 Emag eht htiw Em Pleh 大模拟
- 贪心+数据结构-poj 3110 Jenny's First Exam
- poj 1113:Wall(计算几何,求凸包周长)
- poj 1328 Radar Installation
- POJ 1094 Sorting It All Out (拓扑排序)
- POJ 3678 Katu Puzzle (2-SAT)
- 【poj 1741】点分治
- POJ 3241 Object Clustering 二维平面曼哈顿距离最小生成树
- poj 1741 树分治入门
- poj 2420 A Star not a Tree? 模拟退火
- 【POJ】 2031 Building a Space Station