• 蓝桥杯 穿越雷区(bfs)


    题目描述
    X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
    某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

    已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
    例如:
    A + - + -
    - + - - +
    - + + + -
    + - + - +
    B + - + -

    坦克车只能水平或垂直方向上移动到相邻的区。
     
    输入
    输入第一行是一个整数n,表示方阵的大小, 4<=n<100
    接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
    A,B都只出现一次。
    输出
    要求输出一个整数,表示坦克从A区到B区的最少移动步数。
    如果没有方案,则输出-1
     
    样例输入
    5
    A + - + -
    - + - - +
    - + + + -
    + - + - +
    B + - + -
    样例输出
    10


     1 #include<iostream>
     2 #include<queue>
     3 
     4 using namespace std;
     5 
     6 struct node
     7 {
     8     char ch;    // 该坐标处的字符 
     9     int x, y;    // 在地图上的坐标 
    10     int step;    // 步数(层数) 
    11 }nod;
    12 
    13 char mp[110][110];
    14 int vis[110][110];
    15 int dx[4] = {1,-1,0,0};
    16 int dy[4] = {0,0,1,-1};
    17 int n;
    18 int start_x, start_y;
    19 int flag = 0;
    20 
    21 void bfs(int x, int y)
    22 {
    23     vis[x][y] = 1;
    24     queue<node>Q;
    25     nod.step = 0;
    26     nod.x = x;
    27     nod.y = y;
    28     nod.ch = 'A';
    29     Q.push(nod);
    30     
    31     node t, p;
    32     while(!Q.empty())
    33     {
    34         t = Q.front();
    35         Q.pop();
    36         
    37         if(t.ch == 'B')
    38         {
    39             flag = 1;
    40             cout << t.step << endl;
    41             return;
    42         }
    43         
    44         for(int i = 0; i < 4; ++i)
    45         {
    46             int xx = t.x + dx[i];
    47             int yy = t.y + dy[i];
    48             
    49             if(xx >= 0 && yy >= 0 && xx < n && yy < n && !vis[xx][yy] && mp[xx][yy] != t.ch) // 这一层的字符不能和前一层的一样,否则坦克会报废 
    50             {
    51                 p.ch = mp[xx][yy];
    52                 p.x = xx;
    53                 p.y = yy;
    54                 p.step = t.step + 1;
    55                 Q.push(p);
    56             }
    57         }
    58     
    59     }
    60     
    61     cout << -1 << endl;        // 队列已经空了仍然没有找到方案,则输出-1 
    62     
    63 }
    64 
    65 int main()
    66 {
    67     cin >> n;
    68     for(int i = 0; i < n; ++i)
    69         for(int j = 0; j < n; ++j)
    70         {
    71             cin >> mp[i][j];
    72             if(mp[i][j] == 'A')
    73             {
    74                 start_x = i;
    75                 start_y = j;
    76             }
    77         }    
    78             
    79      bfs(start_x, start_y);
    80 
    81     return 0;
    82 }
    
    
    
     
  • 相关阅读:
    mysql中文乱码解决方法
    MYSQL常用数据类型详解
    aspx中格式化时间的几种方式
    常用PHP中花括号使用规则详解
    jQuery对表单的操作
    jQuery Ajax 实例 ($.ajax、$.post、$.get)
    PHPEXCEL使用基础教程
    LINQ to XML 编程基础
    PHP获取URL各个部分的函数
    phpExcel常用方法详解大全
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10576940.html
Copyright © 2020-2023  润新知