uestc oj 1002 解救小Q

解救小Q

Description

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

现在请你帮助love8909算一算,他至少需要走多少步才能解
救到小Q?

Input

第一行为一个整数T,表示测试数据组数。

每组测试数据第一行为两个整数N,M,(N, M)表示
迷宫的长和宽。

接下来有N行,每行M个字符,是迷宫的具体描述。

.表示安全的位置
#表示陷阱,
Q表示小Q的位置
L表示love8909所在位置,
数据保证love8909只有一个,数据也保证小Q只有一个。

小写字母a-z表示分别表示不同的传送阵,数据保证传送阵
两两配对。

Output

每组数据输出一行,解救小Q所需的最少步数,如果无论如何都
无法救小Q,输出-1。

Sample Input

2

5 5
....L
.###.
b#b#a
##.##
...Qa

5 5
....L
.###.
.#.#.
##.##
...Q.
Sample Output

3
-1

 

  这一题就是普通的广度优先搜索求取最短路的题目。
  不过这个题目添加了传动带和陷阱的这两个障碍。
  这一题也是有读入回车的getchar处理因为读入的都是字符的。
  单独开一个数组【26】【2】的存放传送带 用结构体来表示 有表示是第一个节点还是第二个节点的
 flag 还有坐标row col还有 值s
  在广搜的时候遇到传送带就传送过去。
  在传送带的处理上有两个问题是要注意的,一是在初始化的时候判断好那个已经初始化还有那个没有初始化,
  在传动的时候要注意是从哪一个传动到另一个。
  注意在搜索的时候边界条件的判断。不能出界的。
 

#include<cstdio>
#include<cstring>


char map[55][55];
int vis[55][55];
struct node
{
    int step;
    int row;
    int col;
}que[55*55];
struct gate
{
    char s;
    int row;
    int col;
    int flag;
}gate[26][2];
int dir[4][2]={0,1,0,-1,-1,0,1,0};   
int T,N,M;


int main()
{
    //freopen("1.txt","r",stdin);
    scanf("%d",&T);
    getchar();
    while(T--)
    {
       scanf("%d%d",&N,&M);
       getchar();
       memset(vis,0,sizeof(vis));
       for(int i=0;i<26;i++)
       {
           gate[i][0].flag =0;
           gate[i][0].flag =0;   
       }
       int head = 0;
       int tail = 0;
       int mark =0;
       for(int i=0;i<N;i++)
          {
            for(int j=0;j<M;j++)
              {
               scanf("%c",&map[i][j]);
           
                que[tail].step =0;  
               if(map[i][j]=='L')
                 {
                    map[i][j] = '#',  
                    que[tail].row =i;
                    que[tail].col =j;
                    que[tail].step =0;
                    vis[i][j]=1;
                    tail++;     
                 }


               if(map[i][j]>='a'&&map[i][j]<='z')   
               {
                  int a = (int)map[i][j]-'a'; 
                  if(gate[a][0].flag==0)
                  {
                      gate[a][0].row = i;
                      gate[a][0].col = j;
                      gate[a][0].flag = 1;
                  }
                  else
                  {
                      gate[a][1].row = i;   
                      gate[a][1].col = j;
                      gate[a][1].flag = 1;  
                  }
                
               }


              }
              getchar();
          }
       while(head<tail)  
        {
           
           int nx = que[head].row;  
           int ny = que[head].col;
           int temp = head;
           for(int i =0;i<4;i++)
           {
               int nx2 = nx + dir[i][0];
               int ny2 = ny + dir[i][1]; 


               if(nx2>=N||nx2<0||ny2>=M||ny2<0||vis[nx2][ny2]||map[nx2][ny2]=='#')
               continue;
             
               if(map[nx2][ny2]=='Q') 
               {
                   mark =1;
                   printf("%d\n",que[temp].step+1);
               
               }
              
            
               if(map[nx2][ny2]=='.')
               {
                     que[tail].row = nx2 ;
                     que[tail].col = ny2 ;
                   
                     que[tail].step = que[temp].step+1;
                     tail++;
               }
               else
               {
                     int j = (int)map[nx2][ny2]-'a';
                     if(nx2==gate[j][0].row&&ny2==gate[j][0].col)
                     {
                         que[tail].row = gate[j][1].row;
                     
                         que[tail].col = gate[j][1].col;
                         que[tail].step = que[temp].step+1;
                         gate[j][1].flag =0; 
                         tail++;
                     }
                     else
                     {
                         que[tail].row = gate[j][0].row;
                         //printf("%d",gate[j][0].row);
                         que[tail].col = gate[j][0].col;
                         que[tail].step = que[temp].step+1; 
                         gate[j][0].flag =0;
                         tail++;
                     }
                                            
               }
           
              vis[nx2][ny2]=1; 
           }
           head++;
        }
       if(mark==0)
       printf("-1\n");
    }


}
 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
互联网络程序设计是指在互联网上进行程序开发和设计的过程。UESTC则是我国的一所著名高校——电子科技大学。 互联网络程序设计 uestc包含了两个主要的方面:互联网络和程序设计。互联网络是指将多个计算机网络通过通信链路互相连接起来,实现信息共享和资源共享的网络系统。程序设计是指根据需求和目标,通过编写代码和设计算法,实现计算机程序的过程。 互联网络程序设计 uestc的学习内容主要包括以下几个方面: 1. 网络知识:学习互联网络的基本概念、原理和协议,如TCP/IP协议、HTTP协议等。掌握网络编程的基本技术,能够编写网络应用程序。 2. 数据通信:学习数据通信的基本原理和技术,包括数据传输的方式、数据压缩和加密等。了解网络安全和数据保护的基本知识。 3. 程序设计:学习编程语言和开发工具,如Java、C++和Python等。掌握常用的编程技巧和方法,能够设计和实现复杂的网络应用程序。 4. Web开发:学习Web开发的基本知识和技术,包括HTML、CSS、JavaScript等。能够设计和实现交互式的Web应用程序。 5. 数据库技术:学习数据库的基本原理和技术,如SQL语言和数据库管理系统。能够设计和管理数据库,实现数据的存储和检索。 通过学习互联网络程序设计 uestc,可以掌握互联网应用开发的基本技能,具备设计和实现网络应用程序的能力。这对于目前互联网行业的人才需求来说是非常重要的,也为学生提供了广阔的就业和创业机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值