zoukankan      html  css  js  c++  java
  • 2018年湘潭大学程序设计竞赛 F maze

     1 题目描述 
     2 小明来到一个由n x m个格子组成的迷宫,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱。小明所在的位置用'S'表示,目的地用'T'表示。
     3 
     4 小明只能向上下左右相邻的格子移动,每移动一次花费1秒。
     5 
     6 有q个单向传送阵,每个传送阵各有一个入口和一个出口,入口和出口都在迷宫的格子里,当走到或被传送到一个有传送阵入口的格子时,小明可以选择是否开启传送阵。如果开启传送阵,小明就会被传送到出口对应的格子里,这个过程会花费3秒;如果不开启传送阵,将不会发生任何事情,小明可以继续向上下左右四个方向移动。
     7 
     8 一个格子可能既有多个入口,又有多个出口,小明可以选择任意一个入口开启传送阵。使用传送阵是非常危险的,因为有的传送阵的出口在陷阱里,如果小明使用这样的传送阵,那他就会死亡。也有一些传送阵的入口在陷阱里,这样的传送阵是没有用的,因为小明不能活着进入。请告诉小明活着到达目的地的最短时间。
     9 输入描述:
    10 有多组数据。对于每组数据:
    11 第一行有三个整数n,m,q(2≤ n,m≤300,0≤ q ≤ 1000)。
    12 接下来是一个n行m列的矩阵,表示迷宫。
    13 最后q行,每行四个整数x1,y1,x2,y2(0≤ x1,x2< n,0≤ y1,y2< m),表示一个传送阵的入口在x1行y1列,出口在x2行y2列。
    14 输出描述:
    15 如果小明能够活着到达目的地,则输出最短时间,否则输出-116 示例1
    17 输入
    18 复制
    19 5 5 1
    20 ..S..
    21 .....
    22 .###.
    23 .....
    24 ..T..
    25 1 2 3 3
    26 5 5 1
    27 ..S..
    28 .....
    29 .###.
    30 .....
    31 ..T..
    32 3 3 1 2
    33 5 5 1
    34 S.#..
    35 ..#..
    36 ###..
    37 .....
    38 ....T
    39 0 1 0 2
    40 4 4 2
    41 S#.T
    42 .#.#
    43 .#.#
    44 .#.#
    45 0 0 0 3
    46 2 0 2 2
    47 输出
    48 复制
    49 6
    50 8
    51 -1
    52 3
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #include <algorithm>
     6 #include <cmath>
     7 #include <set>
     8 using namespace std;
     9 typedef long long ll;
    10 #define pi acos(-1)
    11 const int N =500;
    12 int n,m,q;
    13 int ex,ey;
    14 char s[N][N];
    15 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    16 struct Nod
    17 {
    18     int x,y,key;
    19 }e[N][N];
    20 struct Node{
    21     int x,y,step;
    22     Node(){}
    23     Node(int x,int y,int step):x(x),y(y),step(step){}
    24     bool operator <(const Node&a) const{
    25     return step>a.step;
    26     }
    27 }ss;
    28 bool check(int x,int y){
    29     if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]!='#')//’T‘ 
    30     return true;
    31     return false;
    32 }
    33 int bfs(Node sta){
    34     priority_queue<Node>Q;//队首的step最小,一定要用优先队列 
    35     Q.push(sta);
    36     while(!Q.empty()) {
    37         Node tmp =Q.top();
    38         Q.pop();
    39         if(tmp.x==ex&&tmp.y==ey){
    40             return tmp.step;
    41         }
    42          if(e[tmp.x][tmp.y].key==1){
    43              int x=e[tmp.x][tmp.y].x;
    44              int y=e[tmp.x][tmp.y].y;
    45              Q.push(Node(x,y,tmp.step+3));//不能让s[x][y]=='#' ,因为别的点可能会走到(x,y). 
    46          }
    47          for(int i=0;i<4;i++){
    48              int tx=tmp.x+dir[i][0];
    49              int ty=tmp.y+dir[i][1];
    50              if(check(tx,ty)){
    51                  s[tx][ty]='#';//这里是为了避免重复。可能会陷入不断重复中 
    52                  Q.push(Node(tx,ty,tmp.step+1));
    53              }
    54          }
    55     }
    56     return -1;
    57 }
    58 int main()
    59 {
    60     while(~scanf("%d%d%d",&n,&m,&q)){    
    61     for(int i=0;i<n;i++){
    62         for(int  j=0;j<m;j++){
    63             cin>>s[i][j];
    64             if(s[i][j]=='S'){
    65             ss.x=i,ss.y=j,ss.step=0;//因为是多组输入。 
    66             }
    67             if(s[i][j]=='T'){
    68                 ex=i,ey=j;
    69             }
    70             e[i][j].key=0;
    71         }        
    72     }
    73     //不用打印路线,那么起点可以不用 记为# 
    74     int x1,x2,y1,y2;
    75     while(q--){
    76         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    77         if(s[x1][y1]!='#'&&s[x2][y2]!='#'){
    78             e[x1][y1].key=1;
    79             e[x1][y1].x=x2;
    80             e[x1][y1].y=y2;
    81         }
    82     }
    83     int ans=bfs(ss);
    84     printf("%d
    ",ans);
    85 }
    86 return 0;
    87 }
  • 相关阅读:
    XAF 有条件的对象访问权限
    XAF 顯示 UnInplace Report(設置自定義條件顯示報表,不是根據選擇ListView記錄條件顯示報表)
    XAF 如何自定义PivotGrid单元格显示文本?
    XAF 如何布局详细视图上的按钮
    XAF How to set size of a popup detail view
    XAF Delta Replication Module for Devexpress eXpressApp Framework
    XAF 帮助文档翻译 EasyTest Basics(基础)
    XAF 用户双击ListView记录时禁止显示DetailView
    XAF How to enable LayoutView mode in the GridControl in List Views
    XAF 如何实现ListView单元格批量更改?
  • 原文地址:https://www.cnblogs.com/tingtin/p/10519921.html
Copyright © 2011-2022 走看看