[USACO2011 Open]Corn Maze玉米迷宫

Posted adelalove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO2011 Open]Corn Maze玉米迷宫相关的知识,希望对你有一定的参考价值。

Time Limit: 10 Sec Memory Limit: 128 MB

Description

今年秋天,约翰带着奶牛们去玩玉米迷宫。迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行
。迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口。在这个迷宫里,有一些神奇的
传送点6每个传送点由一对点组成,一旦 走入传送点的某个结点,机器就会强制把你送到传送点的另一头去。所有
的传送点都是双向 的,如果你定到了另一头,机器也会把你送回来。奶牛在一个单位的时间内只能向相邻的四个
方向移动一格,不过传送机传送是瞬间完成 的。现在W西在迷宫里迷路了,她只知道目前的位罝在哪里,请你帮助
她用最短的时间走出 迷宫吧。
Input

第一行:两个用空格分开的整数:N和M,2
第二行到N+1行:第i+1行有M个连续的字符,描述了迷宫第i行的信息。
其中"#"代 表不能通行的玉米地, "."代表可以通行的草地,
"@"代表贝西的起始位罝,"="代表迷宫出口,
大写字母“A”到“Z”总是成对出现的,代表一对传送点
Output

一个整数,表示贝西走出迷宫的最短时间,保证逃离迷宮的路线一定存在

Sample Input

5 6

###=##

#.W.##

#.####

#[email protected]##

######

Sample Output

3

//从起点向右走,通过w传送,再从另一端 走出迷宫
HINT

Source

Silver

解:

期望:100  实际:58

坑点:到达传送点之后强制传送

知道自己的代码水平还是太弱。

一定要加油啊。

 

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 using namespace std;
 5 const int N=500;
 6 int n,m,sx,sy,tx,ty;
 7 int b[N][N],l[N][3],to[N][3];
 8 char s[N];
 9 int d[N][N],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
10 int fx,fy,rx,ry,tmp,cnt;
11 queue<int>qx,qy;
12 void bfs()
13 {
14     d[tx][ty]=0;
15     qx.push(tx);qy.push(ty);
16     while(!qx.empty())
17     {
18         fx=qx.front();qx.pop();
19         fy=qy.front();qy.pop();
20         for(int i=0;i<=3;++i)
21         {
22             rx=fx+dx[i];ry=fy+dy[i];
23             if(rx<1 || rx>n || ry<1 || ry>m) continue;
24             if(!b[rx][ry]) continue;
25             if(b[rx][ry]>1)
26             {
27                 tmp=b[rx][ry];
28                 rx=to[tmp][1];ry=to[tmp][2];
29             }
30             if(d[rx][ry]>d[fx][fy]+1)
31             {
32                 d[rx][ry]=d[fx][fy]+1;
33                 qx.push(rx),qy.push(ry);
34             }
35         }
36     }
37 }
38 int main()
39 {
40     scanf("%d%d",&n,&m);
41     cnt=4;
42     for(int i=1,u;i<=n;++i)
43     {
44         scanf("%s",s+1);
45         for(int j=1;j<=m;++j)
46         {
47             if(s[j]==@) sx=i,sy=j,b[i][j]=1;
48             else if(s[j]==.) b[i][j]=1;
49             else if(s[j]===) tx=i,ty=j,b[i][j]=1;
50             else if(s[j]==#) b[i][j]=0;
51             else {
52                 u=s[j];
53                 if(l[u][0]==0) l[u][0]=++cnt,l[u][1]=i,l[u][2]=j;
54                 else{
55                     cnt++;
56                     to[cnt][1]=l[u][1];to[cnt][2]=l[u][2];
57                     to[l[u][0]][1]=i,to[l[u][0]][2]=j;
58                 }
59                 b[i][j]=cnt;
60             }
61         }
62     }
63     for(int i=1;i<=n;++i)
64      for(int j=1;j<=m;++j)
65       d[i][j]=1e9;
66     bfs();
67     printf("%d",d[sx][sy]);
68     return 0;
69 }
View Code

 













以上是关于[USACO2011 Open]Corn Maze玉米迷宫的主要内容,如果未能解决你的问题,请参考以下文章

[USACO11OPEN]玉米田迷宫Corn Maze

洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze

[USACO11OPEN]Corn Maze S

luogu P1825 [USACO11OPEN]玉米田迷宫Corn Maze 题解

[USACO11OPEN] Corn Maze S - 最短路

[uva11OPEN]玉米田迷宫Corn Maze(广搜bfs)