码迷,mamicode.com
首页 > 其他好文 > 详细

[USACO2011 Open]Corn Maze玉米迷宫

时间:2018-03-14 19:41:51      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:AC   最短时间   turn   水平   void   技术   出现   include   起点   

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.##

#.####

#.@W##

######

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玉米迷宫

标签:AC   最短时间   turn   水平   void   技术   出现   include   起点   

原文地址:https://www.cnblogs.com/adelalove/p/8569290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!