关闭

1002CDOJ(解救小Q)

406人阅读 评论(0) 收藏 举报
做题感,就是很普通的写出了BFS,可是超时,在网上搜到这个高效的,很给力。简单搜索题,求最短路径,优先使用 BFS ,唯一需要注意的地方就是传送阵,传送阵联通的两点的深度一致。为了避免在搜索中寻找传送阵,我们可以在输入过程中,对传送阵两点进行关联。搜索过程中,若遇见传送阵,我们只需把与这一传送阵的另一端入队即可,而当前搜索遇到的这一端无需入队。
下面附上AC代码以及注释,希望能帮助到大家:
View Code
 1 #include<iostream>
 2  using namespace std;
 3 int vis[51][51],ans,n,m,dx[4]={-1,0,1,0},dy[5]={0,1,0,-1};
 4 struct trans
 5 {    int y,x;
 6 }a[2][30];
 7 struct node
 8 {    int c,d,step;
 9 }b[100000];
10 bool flag;char map[51][51];
11 void dfs(int x,int y,int step)
12 {
13     if(map[y][x]=='Q') {flag=true;ans=ans>step?step:ans;}
14     else
15     for(int i=0;i<4;i++)
16     {    int tx=x+dx[i],ty=y+dy[i],k1,k2;
17         if(tx>0&&tx<=m&&ty>0&&ty<=n&&map[ty][tx]!='#'&&vis[ty][tx]==0)
18         {    vis[ty][tx]=1;
19             if(map[ty][tx]>='a' && map[ty][tx]<='z')
20             {
21                 int k=map[ty][tx]-'a';
22                 if(a[0][k].y==ty && a[0][k].x==tx)      k1=a[1][k].y,k2=a[1][k].x;
23                 else      k1=a[0][k].y,k2=a[0][k].x;
24                 vis[k1][k2]=1;
25                 dfs(k2,k1,step+1);           
26                 vis[k1][k2]=0;
27             }
28             else
29             dfs(tx,ty,step+1);
30             vis[ty][tx]=0;
31         }
32     }
33 }
34 int main()
35 {    int T;
36     cin>>T;
37     while(T--)
38     {    cin>>n>>m;
39         flag=false;
40         int head=0,tail=1,vis1[30]={0};
41         ans=101;
42         for(int i=1;i<=n;i++)   
43         {
44             for(int j=1;j<=m;j++)
45             {    cin>>map[i][j];vis[i][j]=0;
46                 if(map[i][j]=='L')    map[i][j]='#',b[0].c=i,b[0].d=j;
47                 else if(map[i][j]>='a' && map[i][j]<='z')
48                 {    int k=map[i][j]-'a';
49                     if(vis1[k]==0)    a[0][k].y=i,a[0][k].x=j,vis1[k]=1;
50                     else a[1][k].y=i,a[1][k].x=j;
51                 }
52             }
53         }
54         b[0].step=0;
55         while(head<tail)
56         {    for(int i=0;i<4;i++)
57             {    int tx=b[head].d+dx[i],ty=b[head].c+dy[i],k1,k2;
58                 if(tx>0&&tx<=m&&ty>0&&ty<=n&&map[ty][tx]!='#'&&vis[ty][tx]==0)
59                 {    vis[ty][tx]=1;
60                     if(map[ty][tx]>='a' && map[ty][tx]<='z')
61                     {
62                         int k=map[ty][tx]-'a';
63                         if(a[0][k].y==ty && a[0][k].x==tx)      k1=a[1][k].y,k2=a[1][k].x;
64                         else      k1=a[0][k].y,k2=a[0][k].x;
65                         b[tail].c=k1,b[tail].d=k2;
66                         b[tail].step=b[head].step+1;tail+=1;                                   
67                     }
68                     else
69                     {    b[tail].c=ty,b[tail].d=tx;
70                         b[tail].step=b[head].step+1;
71                         if(map[ty][tx]=='Q') {flag=true;cout<<b[tail].step<<endl;}    tail+=1;
72                     }
73                 }
74             }
75             head+=1;
76         }
77         if(flag==false)    cout<<"-1"<<endl;
78     }
79 }
80              
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

解救小Q(bfs)

解救小Q   Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte Total Submit: 16       ...
  • wangwenhao00
  • wangwenhao00
  • 2013-08-23 22:55
  • 1228

UESTC 解救小Q

小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。 迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫 里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到 传送阵的另一头。 ...
  • u014634338
  • u014634338
  • 2014-10-30 15:59
  • 813

解救小Q(bfs)

解救小Q 时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte 描述 小Q被邪恶的大魔王困在了迷宫里,love8...
  • zsc2014030403015
  • zsc2014030403015
  • 2015-12-10 19:27
  • 350

C4练习-解救小Q

解救小Q Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) ...
  • llzhh
  • llzhh
  • 2016-07-14 11:20
  • 159

CDOJ-#149 解救小Q(BFS)

题目大意: 解题思路:
  • qinlumoyan
  • qinlumoyan
  • 2014-07-31 20:41
  • 519

CDOJ 解救小Q

#include #include struct point { int x,y; }; struct point gate[26][2],que[2505]; char box[55][55...
  • u014686462
  • u014686462
  • 2014-05-17 16:33
  • 842

UESTC 149——解救小Q

题意:一个迷宫里面有障碍和传送门,遇到传送门就会被强制传送到另一个地方,问到达Q点的最短距离 思路:bfs 错误:最开始的时候以为传送门两端是等价的,就直接把两边一起入队列,距离赋一样的值,后来发...
  • u010734277
  • u010734277
  • 2014-12-31 11:06
  • 493

解救小Q(BFS)

#include #include #include using namespace std; struct node{ int x,y; int len; }; char ma...
  • u010005056
  • u010005056
  • 2013-12-14 22:25
  • 458

【UESTC - 149】 解救小Q 【BFS】

小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。 迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫 里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到 传送阵...
  • qq_37383726
  • qq_37383726
  • 2017-08-05 12:57
  • 184

啊哈!算法—深度优先搜索DFS—解救小哈

小哈去玩迷宫,结果迷路了,小哼去救小哈。迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物。 问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。(注意:障...
  • LY_624
  • LY_624
  • 2016-05-04 16:37
  • 1234
    个人资料
    • 访问:222576次
    • 积分:5216
    • 等级:
    • 排名:第6137名
    • 原创:391篇
    • 转载:35篇
    • 译文:0篇
    • 评论:35条
    最新评论