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点. 思路: 感觉就算 ...
随机推荐
- jquery中的选择器01
<!doctype html> <html> <head> <meta charset="gb2312"> <title> ...
- JAVA技术交流群
推荐:组[八方扑灭]:http://jq.qq.com/?_wv=1027&k=RFLXu0. QQ: 292352612 集团专注于技术.软件project.JAVA.c\c++.WEB. ...
- 选择排序java
先简述选择排序,然后上代码 进行选择排序就是将所有的元素扫描一遍,从中挑选(或者说是选择,这正是这个排序名字的由来)最小的一个元素,将这个最小的元素与最左边的元素交换位置 ,现在最左边的元素就是有序的 ...
- Android 导入第三方jar时 出现ClassNotFoundException
处理方式: 1.首先检查有没有正确的导入该jar和有没有重复导入该jar. 2.如果没有出现1的问题,那么在buildpath->order and export 中将你导入的jar左边的复选框 ...
- 【Unity技能】做一个简单的NPC
1. 写在前面 前几天我看到cgcookie一个教程.学习了下怎么依据已有人物模型制作一个仿版的NPC人物.感觉挺好玩的,整理一下放到博客里! 先看一下教程里面的终于效果. 是不是非常像个幽灵~ 以下 ...
- JAVA编程思想(2) - 操作符(一)
"在最底层,Java中的数据是通过操作符来操作的." 1. 使用Java操作符 -操作符接受一个或者多个參数,并生成一个新值,參数的形式与普通的方法调用不用,但效果是同样的.加号和 ...
- HTML5实际和离线应用分析
当前离线Web申请书,即,该装置不能访问因特网时的应用的执行.HTML5离线应用重点,主要开发人员希望.步骤离线应用开发有:首先我们应该知道设备是否可以连接;然后,它也应该可以访问某些资源(像.CSS ...
- [LeetCode129]Sum Root to Leaf Numbers
题目: Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a nu ...
- 剖析html对标准标签和自定义标签闭合与不闭合渲染问题
昨天在修改去年写的系统的时候无意中看到了当时写的一个利用标准标签未闭合在单元格内把整个单元格颜色渲染成红色的效果,如下: 当时的问题是从后台返回来的是个int整数而%是写在页面上的如图 这 时候就出现 ...
- hdu 1171 Big Event in HDU(母函数)
链接:hdu 1171 题意:这题能够理解为n种物品,每种物品的价值和数量已知,现要将总物品分为A,B两部分, 使得A,B的价值尽可能相等,且A>=B,求A,B的价值分别为多少 分析:这题能够用 ...