Codeforces Round #354 (Div. 2) D. Theseus and labyrinth bfs
D. Theseus and labyrinth
题目连接:
http://www.codeforces.com/contest/676/problem/D
Description
Theseus has just arrived to Crete to fight Minotaur. He found a labyrinth that has a form of a rectangular field of size n × m and consists of blocks of size 1 × 1.
Each block of the labyrinth has a button that rotates all blocks 90 degrees clockwise. Each block rotates around its center and doesn't change its position in the labyrinth. Also, each block has some number of doors (possibly none). In one minute, Theseus can either push the button in order to rotate all the blocks 90 degrees clockwise or pass to the neighbouring block. Theseus can go from block A to some neighbouring block B only if block A has a door that leads to block B and block B has a door that leads to block A.
Theseus found an entrance to labyrinth and is now located in block (xT, yT) — the block in the row xT and column yT. Theseus know that the Minotaur is hiding in block (xM, yM) and wants to know the minimum number of minutes required to get there.
Theseus is a hero, not a programmer, so he asks you to help him.
Input
The first line of the input contains two integers n and m (1 ≤ n, m ≤ 1000) — the number of rows and the number of columns in labyrinth, respectively.
Each of the following n lines contains m characters, describing the blocks of the labyrinth. The possible characters are:
«+» means this block has 4 doors (one door to each neighbouring block);
«-» means this block has 2 doors — to the left and to the right neighbours;
«|» means this block has 2 doors — to the top and to the bottom neighbours;
«^» means this block has 1 door — to the top neighbour;
«>» means this block has 1 door — to the right neighbour;
«<» means this block has 1 door — to the left neighbour;
«v» means this block has 1 door — to the bottom neighbour;
«L» means this block has 3 doors — to all neighbours except left one;
«R» means this block has 3 doors — to all neighbours except right one;
«U» means this block has 3 doors — to all neighbours except top one;
«D» means this block has 3 doors — to all neighbours except bottom one;
«*» means this block is a wall and has no doors.
Left, right, top and bottom are defined from representing labyrinth as a table, where rows are numbered from 1 to n from top to bottom and columns are numbered from 1 to m from left to right.
Next line contains two integers — coordinates of the block (xT, yT) (1 ≤ xT ≤ n, 1 ≤ yT ≤ m), where Theseus is initially located.
Last line contains two integers — coordinates of the block (xM, yM) (1 ≤ xM ≤ n, 1 ≤ yM ≤ m), where Minotaur hides.
It's guaranteed that both the block where Theseus starts and the block where Minotaur is hiding have at least one door. Theseus and Minotaur may be initially located at the same block.
Output
If Theseus is not able to get to Minotaur, then print -1 in the only line of the output. Otherwise, print the minimum number of minutes required to get to the block where Minotaur is hiding.
Sample Input
2 2
+*
*U
1 1
2 2
Sample Output
-1
Hint
题意
给你一个n*m的地图,然后地图有很多标志如题所述
然后他每秒钟要么可以穿过门,要么可以使得所有门都顺时针转动90°
如果你要从A到B,那么从B也必须能够到达A
问你从起点到终点的最短时间是多少
题解:
直接BFS好啦,直接暴力……
请叫我暴力大师QSC,写了700行 233
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int n,m,x1,y1,x2,y2;
char a[maxn][maxn];
int vis[maxn][maxn][4];
struct node
{
int x,y,z,time;
};
bool check(node z,node p)
{
if(p.x<1||p.x>n)return false;
if(p.y<1||p.y>m)return false;
if(a[p.x][p.y]=='*')return false;
if(a[p.x][p.y]=='-')
{
if(p.z%2==0)
{if(z.x==p.x-1||z.x==p.x+1)return false;}
else
{if(z.y==p.y-1||z.y==p.y+1)return false;}
}
if(a[p.x][p.y]=='|')
{
if(p.z%2==1)
{if(z.x==p.x-1||z.x==p.x+1)return false;}
else
{if(z.y==p.y-1||z.y==p.y+1)return false;}
}
if(a[p.x][p.y]=='^')
{
if(p.z%4==0)
if(z.x!=p.x-1)return false;
if(p.z%4==1)
if(z.y!=p.y+1)return false;
if(p.z%4==2)
if(z.x!=p.x+1)return false;
if(p.z%4==3)
if(z.y!=p.y-1)return false;
}
if(a[p.x][p.y]=='>')
{
if(p.z%4==3)
if(z.x!=p.x-1)return false;
if(p.z%4==0)
if(z.y!=p.y+1)return false;
if(p.z%4==1)
if(z.x!=p.x+1)return false;
if(p.z%4==2)
if(z.y!=p.y-1)return false;
}
if(a[p.x][p.y]=='v')
{
if(p.z%4==2)
if(z.x!=p.x-1)return false;
if(p.z%4==3)
if(z.y!=p.y+1)return false;
if(p.z%4==0)
if(z.x!=p.x+1)return false;
if(p.z%4==1)
if(z.y!=p.y-1)return false;
}
if(a[p.x][p.y]=='<')
{
if(p.z%4==1)
if(z.x!=p.x-1)return false;
if(p.z%4==2)
if(z.y!=p.y+1)return false;
if(p.z%4==3)
if(z.x!=p.x+1)return false;
if(p.z%4==0)
if(z.y!=p.y-1)return false;
}
if(a[p.x][p.y]=='L')
{
if(p.z%4==1)
if(z.x==p.x-1)return false;
if(p.z%4==2)
if(z.y==p.y+1)return false;
if(p.z%4==3)
if(z.x==p.x+1)return false;
if(p.z%4==0)
if(z.y==p.y-1)return false;
}
if(a[p.x][p.y]=='R')
{
if(p.z%4==3)
if(z.x==p.x-1)return false;
if(p.z%4==0)
if(z.y==p.y+1)return false;
if(p.z%4==1)
if(z.x==p.x+1)return false;
if(p.z%4==2)
if(z.y==p.y-1)return false;
}
if(a[p.x][p.y]=='U')
{
if(p.z%4==0)
if(z.x==p.x-1)return false;
if(p.z%4==1)
if(z.y==p.y+1)return false;
if(p.z%4==2)
if(z.x==p.x+1)return false;
if(p.z%4==3)
if(z.y==p.y-1)return false;
}
if(a[p.x][p.y]=='D')
{
if(p.z%4==2)
if(z.x==p.x-1)return false;
if(p.z%4==3)
if(z.y==p.y+1)return false;
if(p.z%4==0)
if(z.x==p.x+1)return false;
if(p.z%4==1)
if(z.y==p.y-1)return false;
}
if(vis[p.x][p.y][p.z])return false;
vis[p.x][p.y][p.z]=1;
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
queue<node> Q;
Q.push(node{x1,y1,0,0});
vis[x1][y1][0]=1;
int flag = 0;
node next;
while(!Q.empty())
{
node now = Q.front();
if(now.x==x2&&now.y==y2)
{
printf("%d\n",now.time);
return 0;
}
Q.pop();
if(a[now.x][now.y]=='+')
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
if(a[now.x][now.y]=='-')
{
if(now.z%2==0)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
}
else
{
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='|')
{
if(now.z%2==1)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
}
else
{
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='^')
{
if(now.z%4==0){
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==1)
{
next=now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==2)
{
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==3)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='v')
{
if(now.z%4==2){
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==3)
{
next=now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==0)
{
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==1)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='<')
{
if(now.z%4==1){
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==2)
{
next=now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==3)
{
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==0)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='>')
{
if(now.z%4==3){
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==0)
{
next=now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==1)
{
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==2)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='L')
{
if(now.z%4==0)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==1)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==2)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==3)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='R')
{
if(now.z%4==2)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==3)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==0)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==1)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='U')
{
if(now.z%4==3)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==0)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==1)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==2)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
if(a[now.x][now.y]=='D')
{
if(now.z%4==1)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==2)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==3)
{
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x++;
next.time++;
if(check(now,next))
Q.push(next);
}
else if(now.z%4==0)
{
next = now;
next.y++;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.y--;
next.time++;
if(check(now,next))
Q.push(next);
next=now;
next.x--;
next.time++;
if(check(now,next))
Q.push(next);
}
}
next=now;
next.time++;
next.z=(next.z+1)%4;
if(!vis[next.x][next.y][next.z])
{
vis[next.x][next.y][next.z]=1;
Q.push(next);
}
}
printf("-1\n");
}
/*
3 3
->v
*+|
+*^
3 3
1 1
*/
Codeforces Round #354 (Div. 2) D. Theseus and labyrinth bfs的更多相关文章
- Codeforces Round #354 (Div. 2) D. Theseus and labyrinth
题目链接: http://codeforces.com/contest/676/problem/D 题意: 如果两个相邻的格子都有对应朝向的门,则可以从一个格子到另一个格子,给你初始坐标xt,yt,终 ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #354 (Div. 2)-D
D. Theseus and labyrinth 题目链接:http://codeforces.com/contest/676/problem/D Theseus has just arrived t ...
- Codeforces Round #354 (Div. 2)
贪心 A Nicholas and Permutation #include <bits/stdc++.h> typedef long long ll; const int N = 1e5 ...
- Codeforces Round #354 (Div. 2)-C
C. Vasya and String 题目链接:http://codeforces.com/contest/676/problem/C High school student Vasya got a ...
- Codeforces Round #354 (Div. 2)-B
B. Pyramid of Glasses 题目链接:http://codeforces.com/contest/676/problem/B Mary has just graduated from ...
- Codeforces Round #354 (Div. 2)-A
A. Nicholas and Permutation 题目链接:http://codeforces.com/contest/676/problem/A Nicholas has an array a ...
- Codeforces Round #354 (Div. 2) C. Vasya and String
题目链接: http://codeforces.com/contest/676/problem/C 题解: 把连续的一段压缩成一个数,对新的数组求前缀和,用两个指针从左到右线性扫一遍. 一段值改变一部 ...
- Codeforces Round #354 (Div. 2)_Vasya and String(尺取法)
题目连接:http://codeforces.com/contest/676/problem/C 题意:一串字符串,最多改变k次,求最大的相同子串 题解:很明显直接尺取法 #include<cs ...
随机推荐
- Permutation Index I & II
Given a permutation which contains no repeated number, find its index in all the permutations of the ...
- iptables详细设置
1.安装iptables防火墙 怎么知道系统是否安装了iptables?执行iptables -V,如果显示如: iptables v1.3.5 说明已经安装了iptables. 如果没有安装ipta ...
- 【内核】几个重要的linux内核文件【转】
转自:http://www.cnblogs.com/lcw/p/3159394.html Preface 当用户编译一个linux内核代码后,会产生几个文件:vmlinz.initrd.img, 以及 ...
- Monkeyrunner的相关总结
1.1 monkeyrunner API 主要包括三个模块1.MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示提供了方法.2 ...
- 3->集群架构主机克隆教程
centos7系统集群主机克隆: 有道笔记链接地址
- WCF - Autofac IOC
/// <summary> /// IOC实例提供者,基于AutoFac /// /// </summary> public class IocInstanceProvider ...
- 【Android开发日记】之入门篇(八)——Android数据存储(下)
废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...
- Linux学习笔记:644、755、777权限详解
一.问题 1.在Linux或者Android系统下用命令ll或者ls -la的时候会看到前面-rw-rw-r--一串字符,不知道代表什么? 2.新建vi一个文件之后,经常需要chmod 755 fil ...
- 在EC2上创建root用户,并使用root用户登录
今天开始研究亚马逊的云主机EC2,遇到了一个问题,我需要在EC2上安装tomcat,但是yum命令只能是root用户才可以运行,而EC2默认是以ec2-user用户登录的,所以需要切换到root用户登 ...
- 【TensorFlow】一文弄懂CNN中的padding参数
在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...