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. HADOOP百度云资料

    百度云下载地址: 链接:http://pan.baidu.com/s/1pL56hkv 密码:u4h3 解压密码:www.mukedaba.com

  2. jenkins主从服务器部署

    当服务器为linux系统但也有部分ios代码,此时就需要添加一个从jenkins以便编译ios代码.或者需要多个job同时编译这时就需要搭建主从服务器. 1.主(master)节点安装jenkins ...

  3. No.16 selenium学习之路之异常处理

    一.常见的几种异常: SyntaxError:语法错误 NameError:试图访问的变量名不存在 IndexError:索引错误,使用的索引不存在,超出序列范围 KeyError:使用了不存在的关键 ...

  4. python基础学习之路No.1

    版本python2 python语言不分"和',两者可以一样使用,同等效果 1.输出print python3中print是一个函数 print "hello world" ...

  5. Linux下的输入/输出重定向

    Linux环境中支持输入输出重定向,用符号<和>来表示.0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>lee.dat 表示 ...

  6. 【LOJ】 #2545. 「JXOI2018」守卫

    题解 只会蠢蠢的\(n^3\)--菜啊-- 我们发现最右的端点一定会选,看到的点一定是当前能看到的斜率最小的点变得更小一点,记录下这个点,在我们遇到一个看不到的点的时候,然后只用考虑R到它斜率最小的这 ...

  7. 【LOJ】#2292. 「THUSC 2016」成绩单

    题解 神仙dp啊><(也有可能是我菜) 我们发现,想要拿一段区间的话,只和这个区间的最大值和最小值有关系,那么我们考虑,如果一个区间[l,r]我们拿走了一些数后,使它的最小值是a,最大值是 ...

  8. PostgreSQL 入门

    1.连接数设置为:-1.表示链接数不受限制,理论上可以使用无数个链接. 2.使用外键约束,外键用来在两个表的数据之间建立连接,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的 ...

  9. Bootstrap进阶四:jQuery插件详解

    一.模态对话框(Modal) 模态框经过了优化,更加灵活,以弹出对话框的形式出现,具有最小和最实用的功能集. 不支持同时打开多个模态框 千万不要在一个模态框上重叠另一个模态框.要想同时支持多个模态框, ...

  10. ref:JAVA之Forward和Redirect的区别

    ref:https://www.cnblogs.com/selene/p/4518246.html 阅读目录 一:间接请求转发(Redirect) 二:直接请求转发(Forward) 用户向服务器发送 ...