问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区

问题 1825: [蓝桥杯][2015年第六届真题]穿越雷区

时间限制: 1Sec 内存限制: 128MB 提交: 310 解决: 211

题目描述

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
#include <iostream>
#include <queue>
using namespace std;
struct node{
    int x;
    int y;
    int step;
    int status;        //+为1,负为-1,正常为0 
    node(int x, int y, int step = 0, int status = 0): x(x), y(y), step(step), status(status) {}
};
char mp[105][105];
bool vis[105][105];            //记录该点是否已经访问过
int n, sx, sy;
const int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};//方向数组
bool in(int x, int y){    //判断当前坐标是否超界
    return x >= 0 && x < n && y >= 0 && y < n;
}
int bfs(node n){
    queue<node>q;
    q.push(n);
    while(!q.empty()){
        node now = q.front();
        q.pop();
        if(mp[now.x][now.y] == 'B'){
            return now.step;
        }
        for(int i = 0; i < 4; i++){        //以当前点为基准,以四个方向进行试探
            node next = now;
            next.x += dir[i][0];
            next.y += dir[i][1];
            if(!vis[next.x][next.y] && in(next.x, next.y)){
                if((mp[next.x][next.y] == '+' && next.status != 1) || (mp[next.x][next.y] == '-' && next.status != -1) || mp[next.x][next.y] == 'B'){//根据题目要求进行判断
                    vis[next.x][next.y] = true;//标记该点已经访问过
                    next.step++;            //步数记得+1
                    if(mp[next.x][next.y] == '+'){//修改状态
                        next.status = 1;
                    }
                    if(mp[next.x][next.y] == '-'){//修改状态
                        next.status = -1;
                    }
                    q.push(next);        //入队列
                }
            }
        }
    }
    return -1;
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cin >> mp[i][j];
            if(mp[i][j] == 'A'){
                sx = i;
                sy = j;
            }
        }
    }
    node n(sx, sy);
    vis[sx][sy] = true;
    cout << bfs(n) << endl;
    return 0;
}

 

已标记关键词 清除标记
课程目标 从零开始掌握Premiere影视剪辑的基础知识,学会视频剪辑+影视特效+视频调色+字幕制作 适用人群 PR零基础小白,在校大学生,职场新人,想成为影视剪辑、影视后期、短视频制作、自媒体等高手的朋友。 课程简介 课程以新版PR 2020讲解,可使用PR任意版本学习,绝大多数功能兼容旧版,但强烈建议使用新版本。 【Adobe认证专家讲师精耕细作精品教程,非学院派照本宣科软件操作教程,以任务为导向,面向实际应用场景,每一章都能学会实打实的高手技能,讲解细致,小白也能轻松入门成大神!】 课程好不好,看过就知道,前面的免费章节欢迎试看。 本课程学习不需要任何PR基础,只需要电脑操作基础即可。兼容Windows和Mac操作系统,同时讲解两种系统下的快捷键操作,不用担心操作上的障碍问题。 课程特色 1、以实际PR影视编辑与特效的流程为导向,绝大多数内容都是为了完成某个具体任务,而不是为了讲解某个软件操作而凑数。 2、不同于国内多数教程和书籍,每个知识点务求讲精、讲透,帮助你掌握PR的精髓,而非软件操作上的皮毛,让你真正学到PR的本质,一次学习,终身受用,少走弯路,节约生命。 3、课程会随PR新版本的推出持续更新,不必担心有新功能却不知道怎么用。 4、充足的练习题和作业题,让你在不断的练习和挑战中提升PR技能。
相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页