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 ...
随机推荐
- iptables详细设置
1.安装iptables防火墙 怎么知道系统是否安装了iptables?执行iptables -V,如果显示如: iptables v1.3.5 说明已经安装了iptables. 如果没有安装ipta ...
- Python操作Excle
python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库.可从这里下载https://pypi.python.org/pypi.下面分别记录p ...
- Vue 进阶教程之:详解 v-model
分享 Vue 官网教程上关于 v-model 的讲解不是十分的详细,写这篇文章的目的就是详细的剖析一下, 并介绍 Vue 2.2 v-model改进的地方,然后穿插的再说点 Vue 的小知识. 在 V ...
- 三、springcloud之服务调用Feign
一.背景 项目中接口调用: Httpclient Okhttp Httpurlconnection RestTemplate 微服务提供了更简单,方便的Feign 二.Feign简介 Feign是一个 ...
- Nginx - Header详解
1. 前言 通过 HttpHeadersModule 模块可以设置HTTP头,但是不能重写已经存在的头,比如可能相对server头进行重写,可以添加其他的头,例如:Cache-Control,设置生存 ...
- python_selenium自动化测试框架
设计思路 本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享. 框架采用python3 + selenium3 + PO + yaml + ddt + unittest等技术编写成基础测 ...
- 关于json中转义字符/正斜杠的问题。
1.首先有关转义字符 可以看百度百科: 先不管/是否需要转义,我们去json的官方网站去看看:http://www.json.org/ 可见有这个,那么意思是 json中 又规定建议了一下,意思是虽然 ...
- SQLServer判断指定列的默认值是否存在,并修改默认值
SQLServer判断指定列的默认值是否存在,并修改默认值 2008年10月21日 星期二 下午 12:08 if exists(select A.name as DefaultName,B.name ...
- web项目引入extjs小例子
一个新的项目,前端用extjs实现!分享一下extjs开发的准备工作! 首先去下载extjs的资源包,这里我是随便在网上下载的! 打开之后 ,目录是这样的! 需要关注的几个文件夹: builds:压缩 ...
- 利用Octopress在github pages上搭建个人博客
利用Octopress在github pages上搭建个人博客 SEP 29TH, 2013 在GitHub Pages上用Octopress搭建博客,需要安装ruby环境.git环境等.本人在Fed ...