bzoj3299 [USACO2011 Open]Corn Maze玉米迷宫
Description
今年秋天,约翰带着奶牛们去玩玉米迷宫。迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行。
迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口。
在这个迷宫里,有一些神奇的传送点6每个传送点由一对点组成,一旦 走入传送点的某个结点,
机器就会强制把你送到传送点的另一头去。所有的传送点都是双向 的,如果你定到了另一头,机器也会把你送回来。
奶牛在一个单位的时间内只能向相邻的四个方向移动一格,不过传送机传送是瞬间完成 的。
现在W西在迷宫里迷路了,她只知道目前的位罝在哪里,请你帮助她用最短的时间走出 迷宫吧。
Input
第一行:两个用空格分开的整数:N和M,2
第二行到N+1行:第i+1行有M个连续的字符,描述了迷宫第i行的信息。其中"#"代 表不能通行的玉米地,
"."代表可以通行的草地,"@"代表贝西的起始位罝,"="代表迷宫出口,
大写字母“A”到“Z”总是成对出现的,代表一对传送点
Output
第一行:一个整数,表示贝西走出迷宫的最短时间,保证逃离迷宮的路线一定存在
Sample Input
5 6
###=##
#.W.##
#.####
#.@W##
######
Sample Output
HINT
从起点向右走,通过w传送,再从另一端 走出迷宫
现在连sb广搜都会错……
要tp之后再判断不合法情况
#include<cstdio>
#include<cstring>
#define N 510
const int mx[4]={0,1,0,-1};
const int my[4]={1,0,-1,0};
struct go{int x1,x2,y1,y2;}going[30];
int n,m;
int x1,y1,x2,y2,t,w=1;
int mrk[N][N];
bool sent[N][N];
int gox[N][N],goy[N][N];
int qx[N*N];
int qy[N*N];
int dist[N][N];
inline void bfs()
{
memset(dist,-1,sizeof(dist));
qx[1]=x1;
qy[1]=y1;
mrk[x1][y1]=1;
dist[x1][y1]=0;
while (t<w)
{
int nx=qx[++t];
int ny=qy[t];
if (nx==x2&ny==y2)return;
for (int k=0;k<4;k++)
{
int wx=nx+mx[k];
int wy=ny+my[k];
if (sent[wx][wy])
{
int savx=wx,savy=wy;
wx=gox[savx][savy];
wy=goy[savx][savy];
}
if (wx<1||wx>n||wy<1||wy>m||mrk[wx][wy])continue;
mrk[wx][wy]=1;
dist[wx][wy]=dist[nx][ny]+1;
qx[++w]=wx;
qy[w]=wy;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
char ch=getchar();
while (ch!='#'&&ch!='='&&ch!='.'&&ch!='@'&&(ch<'A'||ch>'Z'))ch=getchar();
if (ch=='@'){x1=i;y1=j;}else
if (ch=='#')mrk[i][j]=1;else
if (ch=='='){x2=i;y2=j;}else
if (ch>='A'&&ch<='Z')
{
int rnk=ch-'A'+1;
sent[i][j]=1;
if (!going[rnk].x1)
{
going[rnk].x1=i;
going[rnk].y1=j;
}else
{
going[rnk].x2=i;
going[rnk].y2=j;
}
}
}
for(int i=1;i<=26;i++)
if (going[i].x1)
{
int X1=going[i].x1;
int Y1=going[i].y1;
int X2=going[i].x2;
int Y2=going[i].y2;
gox[X1][Y1]=X2;
goy[X1][Y1]=Y2;
gox[X2][Y2]=X1;
goy[X2][Y2]=Y1;
}
bfs();
printf("%d",dist[x2][y2]);
}
bzoj3299 [USACO2011 Open]Corn Maze玉米迷宫的更多相关文章
- 3299: [USACO2011 Open]Corn Maze玉米迷宫
3299: [USACO2011 Open]Corn Maze玉米迷宫 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 137 Solved: 59[ ...
- 【BZOJ】3299: [USACO2011 Open]Corn Maze玉米迷宫(bfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=3299 映射一下传送门即可.. #include <cstdio> #include &l ...
- 【bzoj 3299】 [USACO2011 Open]Corn Maze玉米迷宫(最短路)
就一个最短路,并且边长都是1,所以每个点只搜一次. /************************************************************** Problem: 3 ...
- BZOJ 3299: [USACO2011 Open]Corn Maze玉米迷宫(BFS)
水题一道却交了4次QAQ,真是蒟蒻QAQ CODE: #include<cstdio>#include<iostream>#include<cstring>#inc ...
- P1825 [USACO11OPEN]玉米田迷宫Corn Maze
题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just any corn m ...
- 洛谷——P1825 [USACO11OPEN]玉米田迷宫Corn Maze
P1825 [USACO11OPEN]玉米田迷宫Corn Maze 题目描述 This past fall, Farmer John took the cows to visit a corn maz ...
- 洛谷—— P1825 [USACO11OPEN]玉米田迷宫Corn Maze
https://www.luogu.org/problem/show?pid=1825 题目描述 This past fall, Farmer John took the cows to visit ...
- 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze
P1825 [USACO11OPEN]玉米田迷宫Corn Maze 题目描述 This past fall, Farmer John took the cows to visit a corn maz ...
- [USACO11OPEN]玉米田迷宫Corn Maze
题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just any corn m ...
随机推荐
- Qt中事件分发源代码剖析(一共8个步骤,顺序非常清楚:全局的事件过滤器,再传递给目标对象的事件过滤器,最终传递给目标对象)
Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的.下面举例说明: 1)首先看看下面一段示例代码: in ...
- 基于MFC与第三方类CWebPage的百度地图API开发范例
在进行百度地图API开发之前你需要到http://developer.baidu.com/map申请密匙 密匙申请之后就可以进行百度地图API的开发了. 下面我们以在visual c++6.0里进行地 ...
- MongoDBAuth
1,mogoDB 认证登陆
- MongoDB C Driver and APIinstances linux MongoDB安装配置
<一,linux平台MongoDB安装配置>在这我们使用的Centos6 yum部署的,你想搞编译,自个干!
- Android技术路线图
邮件问题: 老师你好,我从去年就在看你的关于Android的视频了,的确讲的不错,去年看了一段时间,寒假的时候回家重新复习了一下Java基础知识,开学的时候看到你又陆续出了一些视频,这段时间看完了,跟 ...
- Java中取小数点后两位(四种方法)
摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法) 一 Long是长整型,怎么有小数,是double吧 java.text.D ...
- TI芯片android环境搭建和编译
1>. Reading package lists... Done Building dependency tree Reading state information... Do ...
- libev事件库学习笔记
一.libev库的安装 因为个人的学习环境是在ubuntu 12.04上进行的,所以本节仅介绍该OS下的安装步骤. 使用系统工具自动化安装: sudo apt-get install libev-de ...
- UVa 1394: And Then There Was One
设置一个数组Winner记录经典约瑟夫问题中的剩余者即可递归解决该问题. 注: 约瑟夫问题:有编号为0~n-1的n个人,从0号开始报数1,2,3......报到k的杀死,然后从下一个人开始继续报数1, ...
- Java获取客户端真实IP地址的两种方法
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...