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的更多相关文章

  1. Codeforces Round #354 (Div. 2) D. Theseus and labyrinth

    题目链接: http://codeforces.com/contest/676/problem/D 题意: 如果两个相邻的格子都有对应朝向的门,则可以从一个格子到另一个格子,给你初始坐标xt,yt,终 ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #354 (Div. 2)-D

    D. Theseus and labyrinth 题目链接:http://codeforces.com/contest/676/problem/D Theseus has just arrived t ...

  4. Codeforces Round #354 (Div. 2)

    贪心 A Nicholas and Permutation #include <bits/stdc++.h> typedef long long ll; const int N = 1e5 ...

  5. Codeforces Round #354 (Div. 2)-C

    C. Vasya and String 题目链接:http://codeforces.com/contest/676/problem/C High school student Vasya got a ...

  6. Codeforces Round #354 (Div. 2)-B

    B. Pyramid of Glasses 题目链接:http://codeforces.com/contest/676/problem/B Mary has just graduated from ...

  7. Codeforces Round #354 (Div. 2)-A

    A. Nicholas and Permutation 题目链接:http://codeforces.com/contest/676/problem/A Nicholas has an array a ...

  8. Codeforces Round #354 (Div. 2) C. Vasya and String

    题目链接: http://codeforces.com/contest/676/problem/C 题解: 把连续的一段压缩成一个数,对新的数组求前缀和,用两个指针从左到右线性扫一遍. 一段值改变一部 ...

  9. Codeforces Round #354 (Div. 2)_Vasya and String(尺取法)

    题目连接:http://codeforces.com/contest/676/problem/C 题意:一串字符串,最多改变k次,求最大的相同子串 题解:很明显直接尺取法 #include<cs ...

随机推荐

  1. gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化【转】

    转自:http://blog.csdn.net/qinrenzhi/article/details/78334677 相关博客http://blog.chinaunix.net/uid-2495495 ...

  2. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】

    转自:http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html 一.前言 本文主要围绕IRQ number和中断描述符(interr ...

  3. Android Bander设计与实现 - 设计

    Binder Android IPC Linux 内核 驱动 摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC ...

  4. 使用数据库管理工具打开MySql

    1.推荐使用软件:Navicat_Premium_11.0.10.exe.  下载地址:http://pan.baidu.com/s/1nu6mTF7 2.下载上面文件并安装. 3.打开Navicat ...

  5. Runtime - 消息发送原理

    Runtime - 消息发送原理. Objective-C运行时的核心就在于消息分派器objc_msgSend,消息分派器把选择器映射为函数指针,并调用被引用的函数. 要想理解objc_msgSend ...

  6. Android页面之间进行数据回传

    要求:页面1跳转到页面2,页面2再返回页面1同时返回数据 页面1添加如下代码: Intent intent = new Intent(); intent.setClass(页面1.this, 页面2. ...

  7. RabbitMQ--Publish/Subscribe(四)

    先前例子中,我们创建了一个简单的日志系统,广播messages到consumer接收方. 但如果有日志错误级别的,不同的consumer接收不同错误级别的信息.比如consumer1接收info和wa ...

  8. vue系列之项目优化

    webpack中的Code Splitting Code Splitting是什么以及为什么 在以前,为了减少HTTP请求,通常地,我们会把所有的代码都打包成一个单独的JS文件,但是,如果这个文件体积 ...

  9. OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换

    1:读入图像,显示图像与保存图像 代码: import cv2 img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR) cv2.namedWindow('lena',c ...

  10. 洛谷P1177快速排序

    传送门 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...