[蓝桥杯2015决赛]穿越雷区

题目描述
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,可知这是一个bfs最短路模型,只是在这之上加了一点限制条件,即坦克战车下一个位置必须与当前所在位置能量特征不同,因此只需要在扩展时加一个判断即可。(不愧是搜索杯)

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
const int N = 110;


int n;
char g[N][N];
int dist[N][N];
bool st[N][N];
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};

void bfs(int sx,int sy,int ex,int ey)
{
    queue<PII> q;
    q.push(make_pair(sx,sy));
    dist[sx][sy]  = 0;

    while(q.size()){
        auto t = q.front();
        q.pop();

        int x = t.first,y = t.second;
        for(int i = 0; i < 4; i ++ ){
            int xx = x + dx[i],yy = y + dy[i];
            if(xx < 1 || xx > n || yy < 1 || yy > n || dist[xx][yy])   continue;
            if(g[x][y] == 'A'){
                q.push(make_pair(xx,yy));
                dist[xx][yy] = dist[x][y] + 1;
            }else {
                if(g[x][y] != g[xx][yy]){
                    q.push(make_pair(xx,yy));
                    dist[xx][yy] = dist[x][y] + 1;
                }
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int sx,sy,ex,ey;
    cin >> n;
    for(int i = 1; i <= n; i ++ ){
        for(int j = 1; j <= n; j ++ ){
            cin >> g[i][j];
            if(g[i][j] == 'A'){
                sx = i, sy = j;
            }
            if(g[i][j] == 'B'){
                ex = i, ey = j;
            }
        }
    }

    bfs(sx,sy,ex,ey);

    
    if(dist[ex][ey] == 0)   cout << -1 << endl;
    else cout << dist[ex][ey] <<endl;
    return 0;
}
posted @ 2023-04-27 00:29  车车学不完  阅读(24)  评论(0)    收藏  举报