ZOJ-3652-Maze(BFS)
Celica is a brave person and believer of a God in the bright side. He always fights against the monsters that endanger humans. One day, he is asked to go through a maze to do a important task.
The maze is a rectangle of n*m, and Celica is at (x1,
y1) at the beginning while he needs to go to (x2, y2). And Celica has a Mobility of
l. When he moves a step the movility will decreased by 1. If his mobility equals to 0, he can't move anymore in this turn. And no matter how much mobility Celica uses in one turn, his movility will become
l again in the next turn. And a step means move from one lattice to another lattice that has an adjacent edge.
However, due to the world's rule and the power of magic, there is something called Dominance in the maze. Some lattices may be dominated by some monsters and if Celica goes into these lattices, his mobility will be reduced to 0 at once by the monster's magic
power. And monsters have strong "Domain awareness" so one lattice won't be dominated by more than one monster.
But luckily, Celica gets a strong power from his God so that he can kill this monsters easily. If Celica goes into a lattice which a monster stands on, he can kill the monster without anytime. If a monsters is killed, the lattices it dominates will no longer
be dominated by anyone(or we can say they are dominated by Celica) and these lattices will obey the rule of mobility that normal lattices obey.
As for the task is so important that Celica wants to uses the least turn to go to (x2,
y2). Please find out the answer.
PS1: It doesn't matter if Celica doesn't kill all the monsters in the maze because he can do it after the task and a monster may appear at a lattice that is not dominated by it, even a lattice that is not dominated by any monsters.
PS2: We define (1,1) as the top left corner. And monsters won't move.
PS3: No matter which lattice Celia gets in, the change of mobility happens first.
PS4: We promise that there is no two monsters have same position and no monster will appear at the start point of Celica.
Input
The first contains three integers, n, m, l.(1≤n,
m≤50, 1≤l≤10)
Then there follows n lines and each line contains m integers. The
j-th integer p in the line i describe the lattice in the
i line and j row. If p euqals to -1, it means you can't get into it. If
p euqals to 0, it means the lattice is not dominated by any monster. If
p is larger than 0, it means it is dominated by the p-th monster.
And then in the n+2 line, there is an integer k(0≤k≤5) which means the number of monster.
Then there follows k lines. The i-th line has two integers mean the position of the
i-th monster.
At last, in the n+k+3 lines, there is four integers x1,
y1, x2, y2.
Output
If Celica can't get to the (x2, y2), output "We need God's help!", or output the least turn Celica needs.
Sample Input
5 5 4
2 2 2 1 0
-1 2 2 -1 1
2 2 2 1 1
1 1 1 1 0
1 2 2 -1 0
2
4 2
1 1
5 1 1 5
5 5 4
1 1 1 1 1
1 2 2 -1 -1
2 2 -1 2 2
-1 -1 2 2 2
2 2 2 2 2
2
2 2
1 2
1 1 5 5
Sample Output
4
We need God's help!
Hit
In the first case, Celica goes to (4,1) in turn 1. Then he goes to (4,2) in turn 2. After he gets (4,2), kill the monster 1. He goes through (4,3)->(4,4)>(3,4)->(3,5) in turn 3. At last he goes (2,5)->(1,5) in turn 4.
思路:水搜索,注意细节即可。
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std; struct S{
int x,y,step,state;
}t,qt; int mp[50][50],monx[10],mony[10],nxt[4][2]={{1,0},{0,1},{-1,0},{0,-1}},n,m,l,k;
bool v[1<<5][50][50],vis[1<<5][50][50]; queue<S>que,q; void span(int x,int y,int step,int state)
{
int i,j,temp; for(int lxd=0;lxd<(1<<k);lxd++) for(i=0;i<n;i++) for(j=0;j<m;j++) v[lxd][i][j]=0; qt.x=x;
qt.y=y;
qt.step=l;
qt.state=state; q.push(qt); while(!q.empty())
{
qt=q.front();
q.pop(); temp=qt.state; for(i=0;i<4;i++)
{
qt.x+=nxt[i][0];
qt.y+=nxt[i][1]; qt.state=temp; if(qt.x>=0 && qt.x<n && qt.y>=0 && qt.y<m && mp[qt.x][qt.y]>=0 && !v[qt.state][qt.x][qt.y])
{
v[qt.state][qt.x][qt.y]=1; for(j=0;j<k;j++) if(qt.x==monx[j] && qt.y==mony[j]) break; if(j==k)//没有妖怪
{
if(mp[qt.x][qt.y]==0)
{
qt.step--;
if(qt.step>0) q.push(qt);
qt.step++; t.x=qt.x;
t.y=qt.y;
t.step=step+1;
t.state=qt.state; if(!vis[t.state][t.x][t.y])
{
vis[t.state][t.x][t.y]=1;
que.push(t);
}
}
else
{
if((1<<mp[qt.x][qt.y]-1)&qt.state)
{
qt.step--;
if(qt.step>0) q.push(qt);
qt.step++; t.x=qt.x;
t.y=qt.y;
t.step=step+1;
t.state=qt.state; if(!vis[t.state][t.x][t.y])
{
vis[t.state][t.x][t.y]=1;
que.push(t);
}
}
else
{
t.x=qt.x;
t.y=qt.y;
t.step=step+1;
t.state=qt.state; if(!vis[t.state][t.x][t.y])
{
vis[t.state][t.x][t.y]=1;
que.push(t);
}
}
}
}
else//有妖怪
{
if(mp[qt.x][qt.y]==0)
{
qt.step--;
qt.state|=(1<<j);
v[qt.state][qt.x][qt.y]=1;
if(qt.step>0) q.push(qt);
qt.step++; t.x=qt.x;
t.y=qt.y;
t.step=step+1;
t.state=(qt.state|(1<<j)); if(!vis[t.state][t.x][t.y])
{
vis[t.state][t.x][t.y]=1;
que.push(t);
}
}
else
{
if((1<<mp[qt.x][qt.y]-1)&qt.state)
{
qt.step--;
qt.state|=(1<<j);
v[qt.state][qt.x][qt.y]=1;
if(qt.step>0) q.push(qt);
qt.step++; t.x=qt.x;
t.y=qt.y;
t.step=step+1;
t.state=(qt.state|(1<<j)); if(!vis[t.state][t.x][t.y])
{
vis[t.state][t.x][t.y]=1;
que.push(t);
}
}
else
{
t.x=qt.x;
t.y=qt.y;
t.step=step+1;
v[qt.state][qt.x][qt.y]=1;
t.state=(qt.state|(1<<j)); if(!vis[t.state][t.x][t.y])
{
vis[t.state][t.x][t.y]=1;
que.push(t);
}
}
}
}
} qt.x-=nxt[i][0];
qt.y-=nxt[i][1];
}
}
} int main()
{
int i,j,x1,x2,y1,y2; while(~scanf("%d%d%d",&n,&m,&l))
{
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&mp[i][j]);
}
} scanf("%d",&k); for(i=0;i<k;i++)
{
scanf("%d%d",&monx[i],&mony[i]); monx[i]--;
mony[i]--;
} scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1--;
x2--;
y1--;
y2--; while(!que.empty()) que.pop(); for(int lxd=0;lxd<(1<<k);lxd++) for(i=0;i<n;i++) for(j=0;j<m;j++) vis[lxd][i][j]=0; t.x=x1;
t.y=y1;
t.step=0;
t.state=0; vis[0][t.x][t.y]=1; que.push(t); while(!que.empty())
{
t=que.front(); if(t.x==x2 && t.y==y2)
{
printf("%d\n",t.step);
break;
} que.pop(); span(t.x,t.y,t.step,t.state);
} if(que.empty()) puts("We need God's help!");
}
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
ZOJ-3652-Maze(BFS)的更多相关文章
- ZOJ 3652 Maze 模拟,bfs,读题 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4842 要注意题目中两点: 1.在踏入妖怪控制的区域那一刹那,先减行动力,然后才 ...
- zoj 3652 Maze
Maze Time Limit: 2 Seconds Memory Limit: 65536 KB Celica is a brave person and believer of a Go ...
- poj 3026 Borg Maze (BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit:1000MS Memory Limit:65536KB 64bit IO For ...
- POJ3026——Borg Maze(BFS+最小生成树)
Borg Maze DescriptionThe Borg is an immensely powerful race of enhanced humanoids from the delta qua ...
- POJ 3026 Borg Maze bfs+Kruskal
题目链接:http://poj.org/problem?id=3026 感觉英语比题目本身难,其实就是个最小生成树,不过要先bfs算出任意两点的权值. #include <stdio.h> ...
- Borg Maze(bfs+prim)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6971 Accepted: 2345 Description The B ...
- LightOJ 1337 F - The Crystal Maze (bfs)
Description You are in a plane and you are about to be dropped with a parasuit in a crystal maze. As ...
- POJ3026 Borg Maze(bfs求边+最小生成树)
Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of ...
- CodeForces - 377A Maze BFS逆思维
Maze Pavel loves grid mazes. A grid maze is an n × m rectangle maze where each cell is either empty, ...
- POJ - 3026 Borg Maze BFS加最小生成树
Borg Maze 题意: 题目我一开始一直读不懂.有一个会分身的人,要在一个地图中踩到所有的A,这个人可以在出发地或者A点任意分身,问最少要走几步,这个人可以踩遍地图中所有的A点. 思路: 感觉就算 ...
随机推荐
- Oracle 阅读器-刚看完表空间回复的详细解释
(一) 当使用一个控制文件的备份恢复,例如下面的附图.使用备份控制文件恢复位置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGVtb25zb24=/fo ...
- 【POJ1741】Tree 树分而治之 模板略?
做广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog. ...
- mysql计算指定的时间TPS
<pre name="code" class="sql">有朋友留言,需要监视如早晨在规定时间内9设置18分TPS,写一个10在几秒钟内TPS方法. ...
- Oracle db中 CONNECT role的含义
出自: Complete Checklist for Manual Upgrades to 11gR2 (文档 ID 837570.1) 该文章中有例如以下的文字: From Oracle 10.2, ...
- 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to'org.eclipse ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
- iOS英语—》中国本土化,如调用专辑,摄像头的变化“cancel”,“photos”至“撤消”,“摄像头”
呼叫系统相册.系统相簿界面后标题显示"photos",可是手机语言已经设置显示中文,纠结半天,终于在info.plist设置解决这个问题. 仅仅须要改三个地方: 1.plist文件 ...
- RESTful API Design With NodeJS & Restify
http://code.tutsplus.com/tutorials/restful-api-design-with-nodejs-restify--cms-22637 The RESTful API ...
- Java 对象的生命周期
Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisib ...
- hdu4190 简单的二分法
题意是 有n个城市,m个投票箱.接下来n个城市人口数,每一个投票箱都不能为空.计算最后投票箱的容量必须达到多少,才干满足须要. 每一个城市的人必须仅仅能将票投到自己城市分得得投票箱中.要是容量最小箱子 ...