• JZ高中OJ 1432. 输油管道


    Description

      请你帮忙设计一个从城市M到城市Z的输油管道,现在已经把整个区域划分为R行C列,每个单元格可能是空的也可能是以下7种基本管道之一:
      

      油从城市M流向Z,‘+’型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:

            


      现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。
     

    Input

      第一行包含两个整数R和C(1<=R,C<=25)。
      接下来R行每行C个字符描述被偷之后的形状,字符分为以下三种:
      (1)‘.’表示空;
      (2)字符‘|’(ASCII为124)、‘-’、‘+’、‘1’、‘2’、‘3’、‘4’描述管道的形状;
      (3)‘M’和‘Z’表示城市,两个都是只出现一次。
      输入保证石油的流向是唯一的,只有一个管道跟M和Z相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
      输入保证有解而且是唯一的。

    Output

      输出被偷走的管道的行号和列号以及管道的类型。
     

    Sample Input

    输入1:
    3 7
    .......
    .M-.-Z.
    .......
    
    输入2:
    3 5
    ..1-M
    1-+..
    Z.23.
    
    输入3:
    6 10
    Z.1----4..
    |.|....|..
    |..14..M..
    2-+++4....
    ..2323....
    ..........
    

    Sample Output

    输出1:
    2 4 -
    
    输出2:
    2 4 4
    
    输出3:
    3 3 |
      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 const int MAXRC = 25+5;
      4 const int cmpdis[4][2] = { {0, -1}, {1, 0}, {0, 1}, {-1, 0} };
      5 const int cmppipe[5][2] = { {0, 0}, {1, 2}, {3, 2}, {3, 0}, {1, 0} };
      6 
      7 char g[MAXRC][MAXRC];
      8 
      9 int r, c, sx, sy, fx, fy;
     10 
     11 inline bool SF (int x, int y) {
     12     return (x == fx && y == fy || x == sx && y == sy);
     13 }
     14 
     15 inline void check (int x, int y, int dis) {
     16     int i=dis;
     17     if ((g[x+1][y] == '|' || SF(x+1, y) || g[x+1][y] == '2' || g[x+1][y] == '3' || g[x+1][y] == '+') && (g[x-1][y] == '|' || SF(x-1, y) || g[x-1][y] == '1' || g[x-1][y] == '4' || g[x-1][y] == '+') && (g[x][y-1] == '-' || SF(x, y-1) || g[x][y-1] == '1' || g[x][y-1] == '2' || g[x][y-1] == '+') && (g[x][y+1] == '-' || SF(x, y+1) || g[x][y+1] == '4' || g[x][y+1] == '3' || g[x][y+1] == '+')) {
     18         printf ("%d %d +
    ", x, y);
     19         exit (0);
     20     }
     21     if ((dis == 0)) {
     22         int nx=x + cmpdis[i][0];
     23         int ny=y + cmpdis[i][1];
     24         if (g[nx][ny] == '-' || g[nx][ny] == '+' || g[nx][ny] == '1' || g[nx][ny] == '2' || SF (nx, ny)){
     25             printf ("%d %d -
    ", x, y);
     26             exit(0);
     27         }
     28     }
     29     if ((dis == 2)) {
     30         int nx=x + cmpdis[i][0];
     31         int ny=y + cmpdis[i][1];
     32         if (g[nx][ny] == '-' || g[nx][ny] == '+' || g[nx][ny] == '3' || g[nx][ny] == '4' || SF (nx, ny)){
     33             printf ("%d %d -
    ", x, y);
     34             exit(0);
     35         }
     36     }
     37     if ((dis == 1)) {
     38         int nx=x + cmpdis[i][0];
     39         int ny=y + cmpdis[i][1];
     40         if (g[nx][ny] == '|' || g[nx][ny] == '+' || g[nx][ny] == '3' || g[nx][ny] == '2' || SF (nx, ny)){
     41             printf ("%d %d |
    ", x, y);
     42             exit(0);
     43         }
     44     }
     45     if ((dis == 3)) {
     46         int nx=x + cmpdis[i][0];
     47         int ny=y + cmpdis[i][1];
     48         if (g[nx][ny] == '|' || g[nx][ny] == '+' || g[nx][ny] == '1' || g[nx][ny] == '4' || SF (nx, ny)){
     49             printf ("%d %d |
    ", x, y);
     50             exit(0);
     51         }
     52     }
     53     if (dis == 3) {
     54         if (g[x][y+1] == '-' || g[x][y+1] == '+' || g[x][y+1] == '3' || g[x][y+1] == '4' || SF (x, y+1)) {
     55             printf ("%d %d 1
    ", x, y);
     56             exit(0);
     57         }
     58     }
     59     if (dis == 0) {
     60         if (g[x+1][y] == '|' || g[x+1][y] == '+' || g[x+1][y] == '2' || g[x+1][y] == '3' || SF (x+1, y)) {
     61             printf ("%d %d 1
    ", x, y);
     62             exit(0);
     63         }
     64     }
     65     if (dis == 1) {
     66         if (g[x][y+1] == '-' || g[x][y+1] == '+' || g[x][y+1] == '3' || g[x][y+1] == '4' || SF (x, y+1)) {
     67             printf ("%d %d 2
    ", x, y);
     68             exit(0);
     69         }
     70     }
     71     if (dis == 0) {
     72         if (g[x-1][y] == '|' || g[x-1][y] == '+' || g[x-1][y] == '1' || g[x-1][y] == '4' || SF (x-1, y)) {
     73             printf ("%d %d 2
    ", x, y);
     74             exit(0);
     75         }
     76     }
     77     if (dis == 2) {
     78         if (g[x-1][y] == '|' || g[x-1][y] == '+' || g[x-1][y] == '1' || g[x-1][y] == '4' || SF (x-1, y)) {
     79             printf ("%d %d 3
    ", x, y);
     80             exit(0);
     81         }
     82     }
     83     if (dis == 1) {
     84         if (g[x][y-1] == '-' || g[x][y-1] == '+' || g[x][y-1] == '1' || g[x][y-1] == '2' || SF (x, y-1)) {
     85             printf ("%d %d 3
    ", x, y);
     86             exit(0);
     87         }
     88     }
     89     if (dis == 2) {
     90         if (g[x+1][y] == '|' || g[x+1][y] == '+' || g[x+1][y] == '2' || g[x+1][y] == '3' || SF (x+1, y)) {
     91             printf ("%d %d 4
    ", x, y);
     92             exit(0);
     93         }
     94     }
     95     if (dis == 3) {
     96         if (g[x][y-1] == '-' || g[x][y-1] == '+' || g[x][y-1] == '1' || g[x][y-1] == '2' || SF (x, y-1)) {
     97             printf ("%d %d 4
    ", x, y);
     98             exit(0);
     99         }
    100     }
    101     return;
    102 }
    103         
    104 void dfs (int x, int y, int dis) {
    105     if (dis == -1) {
    106         for (int i=0; i<4; i++) {
    107             int nx=x + cmpdis[i][0];
    108             int ny=y + cmpdis[i][1];
    109             if (nx < 1 || nx > r || ny < 1 || ny > c) continue;
    110             if (g[nx][ny] == '.') {
    111                 check(nx, ny, i);
    112                 continue;
    113             }
    114             if (1 <= g[nx][ny] - '0' && g[nx][ny] - '0' <=4) {
    115                 dfs (nx, ny, cmppipe[g[nx][ny] - '0'][i%2]);
    116                 return;
    117             }
    118             else {
    119                 dfs (nx, ny, i);
    120                 return;
    121             }
    122         }
    123     }
    124     int nx=x + cmpdis[dis][0];
    125     int ny=y + cmpdis[dis][1];
    126     if (g[nx][ny] == '.') {
    127         check(nx, ny, dis);
    128     }
    129     if (1 <= g[nx][ny] - '0' && g[nx][ny] - '0' <=4) {
    130         dfs (nx, ny, cmppipe[g[nx][ny] - '0'][dis%2]);
    131         return;
    132     }
    133     else {
    134         dfs (nx, ny, dis);
    135         return;
    136     }
    137     return;
    138 }
    139 
    140 int main() {
    141     cin>>r>>c;
    142     for (int i=1; i<=r; i++) {
    143         for (int j=1; j<=c; j++) {
    144             char ch;
    145             cin >>ch;
    146             g[i][j]=ch;
    147             if (g[i][j] == 'M') {
    148                 sx=i;
    149                 sy=j;
    150             }
    151             if (g[i][j] == 'Z') {
    152                 fx=i;
    153                 fy=j;
    154             }
    155         }
    156     }
    157     dfs (sx,sy,-1);
    158     return 0;
    159 }
  • 相关阅读:
    Spring的设计理念和整体架构
    垃圾收集器与内存分配策略(3)
    垃圾收集器与内存分配策略(2)
    实践一次有趣的sql优化
    PHP之static
    PHP之const
    MySQL数据库常用操作
    PHP之__aotoload()自动加载机制
    PHP之类的属性方法重写
    MYSQL工具类简单实现
  • 原文地址:https://www.cnblogs.com/dsanying/p/11306766.html
Copyright © 2020-2023  润新知