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 ...
随机推荐
- Linux内存初始化【转】
转自:http://www.cnblogs.com/super-king/p/3291120.html start_kernel -> setup_arch 在这个函数中我们主要看这几个函数. ...
- html5新增表单元素
1.验证 <form> <input type="email"></input> 验证邮箱 <input type="ur ...
- maxout激活函数
maxout的拟合能力是非常强的,它可以拟合任意的的凸函数.最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白),而maxout又是取k个隐隐含层节点的最大值,这些 ...
- Oracle 函数 “申请通过后,将该表中循环遍历到的所有内容插到另一个表中”
create or replace function mcode_apply_insert_material(p_mca_no VARCHAR2, p_action VARCHAR2, p_wf_no ...
- 洛谷P1411 砝码称重
传送门啦 这个题总体思路就是先搜索在 $ dp $ void dfs(int keep,int now){ //使用 放弃 if(now > m) return; //已经放弃超过m个了,就退出 ...
- ZooKeeper的典型应用场景
<从Paxos到Zookeeper 分布式一致性原理与实践>读书笔记 本文:总结脑图地址:脑图 前言 所有的典型应用场景,都是利用了ZK的如下特性: 强一致性:在高并发情况下,能够保证节点 ...
- INSTEAD OF与AFTER触发器
INSTEAD OF 触发器 AFTER 触发器(也叫“FOR”触发器)会在触发 insert.update 或是delect 动作之后执行.例如,一个 Employees 表上的 AFTER 触发器 ...
- 整理一下关于Crypto加密的坑
之前写接口一般不用加密(做了权限处理),最近公司要求接口加密,我开始了入坑之路 因为公司其他人用的AES和DES加密,我就在网上查了下关于这方面的使用方法. 首先安装Crypto pip instal ...
- Fedora下Eclipse/MyEclipse崩溃的解决方案
Fedora19下使用myeclipse2013时,打开不到一分钟就异常关闭. 默认在home目录下生成一个log文件,里面显示的错误信息,说是libsoup.so文件导致出错.第一个想法是删除这个文 ...
- Java第三阶段学习(二、IO流--------递归,字节流Stream)
一.递归 定义:指方法在方法内调用自己 适用于方法的运算主体不变,但运行的时候,参与运算的方法参数会变化注意:一定要给递归一个出口,否则内存溢出 练习题1:使用递归打印文件夹中所有的文件,包含子目录中 ...