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点. 思路: 感觉就算 ...
随机推荐
- 重新想象 Windows 8 Store Apps (11) - 控件之 ListView 和 GridView
原文:重新想象 Windows 8 Store Apps (11) - 控件之 ListView 和 GridView [源码下载] 重新想象 Windows 8 Store Apps (11) - ...
- nyoj 117 找到的倒数 【树阵】+【分离】
这个问题的解决方案是真的很不错!!! 思路:建立一个结构体包括val和id. val就是输入的数,id表示输入的顺序.然后依照val从小到大排序.假设val相等.那么就依照id排序. 假设没有逆序的话 ...
- 3Dmax+blend+WPF综合运用
原文:3Dmax+blend+WPF综合运用 赛后总结 本人小菜,WPF刚入门,只是写一下最近的项目心得.欢迎各位前辈们前来拍砖指正,感激不敬!先申明,小弟我入门仓促,很多东西也是一知半解,所以很多问 ...
- 【原创】《算法导论》链表一章带星习题试解——附C语言实现
原题: 双向链表中,需要三个基本数据,一个携带具体数据,一个携带指向上一环节的prev指针,一个携带指向下一环节的next指针.请改写双向链表,仅用一个指针np实现双向链表的功能.定义np为next ...
- Xamarin.Android 入门实例(1)之获取与解析JSON
1.Main.axml 视图界面 2.视图代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- 开展:随笔记录 OSGI的jar增加了一些小问题和注意事项
在引用jar当包,假设引用的项目包.在需要MANIFEST.MF 它定义 一.外用jar: 实例:外部参考需要包装的Import package里面 定义一下.如:google-gson-2.2.2. ...
- Hadoop入门进阶步步高(六)-Hadoop1.x与Hadoop2的差别
六.Hadoop1.x与Hadoop2的差别 1.变更介绍 Hadoop2相比較于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了非常大的提高,Ha ...
- cocos2dx-3.0(13)------SpriteBatchNode与SpriteFrameCache渲染速度
大家都知道一个游戏里面会有大量的图片,每一个图片渲染是须要时间的,以下分析两个类来加快渲染速度,加快游戏执行速度 一.SpriteBatchNode 1.先说下渲染 ...
- JAVA DATE类型推断尺寸数据比较法
两Date变量类型通过compareTo的方式来比较.这种方法的叙述描述的是,这:假设参数 Date 等于该 Date.返回值 0.假设这 Date 于 Date 在参数,它返回小于 0 的值.假设这 ...
- 流动python - 什么是魔术方法(magic method)
我们经常看到各种各样的方法已经被包围了由双下划线,例如__init__,他们是魔术方法. 魔术方法python语言预订好"协议",在不同情况下不同的魔术方法,是隐式调用.我们重写这 ...