蓝桥杯历届-穿越雷区
蓝桥杯历届-穿越雷区
标题:穿越雷区
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
典型的dfs思路即可,数据不是太大,可以过!
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAX_N = 101;
char s[MAX_N][MAX_N];
int book[MAX_N][MAX_N];
int N, startX, startY, endX, endY;
int MIN1 = 99999;
bool f;
int C = 0;
int next[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}
};
int getX(char c) {for (int i = 0; i< N; i++) {for (int j = 0; j < N; j++) {if (s[i][j] == c) return i;}}
}
int getY(char c) {for (int i = 0; i< N; i++) {for (int j = 0; j < N; j++) {if (s[i][j] == c) return j;}}
}
void dfs(int x, int y, int step) {// 四种走法 上下左右 for (int i = 0; i < 4; i++) {int tx = x + next[i][0];int ty = y + next[i][1];// 判断是否越界 if (tx < 0 || tx > N || ty < 0 || ty > N) continue;// 判断交替 if (s[x][y] == '+') f = true;else if (s[x][y] == '-') f = false;if (tx == endX && ty == endY) {// 更新最小值if (step < MIN1) MIN1 = step;return; //返回 }// 判断是否是障碍物或者已经走过 if (f && C > 0) {if (book[tx][ty] == 0 && s[tx][ty] == '-') {C++;book[tx][ty] = 1;dfs(tx, ty, step+1);book[tx][ty] = 0;}} else if(!f && C > 0){if (book[tx][ty] == 0 && s[tx][ty] == '+') {C++;book[tx][ty] = 1;dfs(tx, ty, step+1);book[tx][ty] = 0;}} else {if (book[tx][ty] == 0) {C++;book[tx][ty] = 1;dfs(tx, ty, step+1);book[tx][ty] = 0;}}}
}
int main() {freopen("in.txt", "r", stdin);scanf("%d", &N);getchar();for (int i = 0; i< N; i++) {for (int j = 0; j < N; j++) {scanf("%c", &s[i][j]);getchar();}}for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) book[i][j] = 0;}startX = getX('A');startY = getY('A');endX = getX('B');endY = getY('B');book[startX][startY] = 1;dfs(startX, startY, 1);if (MIN1 == 99999) MIN1 = -1;cout << MIN1 << endl;return 0;
}
蓝桥杯历届-穿越雷区相关推荐
- 蓝桥杯之穿越雷区 BFS
本题为2015年第六届蓝桥杯C语言A组试题,第4题. 考点:广度优先搜索(BFS) 广搜一般用来解决"最短""最少"问题,需用到队列. 题目描述 标题:穿越雷区 ...
- 标题 穿越雷区 java_【蓝桥杯】穿越雷区-java语言描述
标题:穿越雷区X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最 ...
- 蓝桥杯:穿越雷区——DFS
标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径 ...
- 蓝桥杯_穿越雷区 java
题目描述 X 星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从 A 区到 B 区去( A,B 区本身是安全区,没有正能量或负能量特征),怎样走 ...
- [蓝桥杯][历届试题]国王的烦恼(反向+并查集)
问题 1435: [蓝桥杯][历届试题]国王的烦恼 时间限制: 1Sec 内存限制: 128MB 提交: 802 解决: 213 题目描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了 ...
- 蓝桥杯 - 历届试题 - 日期问题
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_33531813/article/details/79516258 </div>&l ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- 二分搜索,POJ2456,NYOJ 914, 区间移位-蓝桥杯-历届试题
二分搜索是不断缩减可能解的范围来得到最优解, 因为每次是折半, 所以指数爆炸有多快,这个效率就有多高 POJ2456为例, 传送门 简而言之, 就是将牛之间的距离的最小值最大化. #include&l ...
- 蓝桥杯历届试题代码参考
蓝桥杯历届试题代码参考 历届试题 核桃的数量 打印十字图 带分数 剪格子 错误票据 翻硬币 连号区间数 买不到的数目 大臣的旅费 幸运数 横向打印二叉树 危险系数 网络寻路 高僧斗法 格子刷油漆 农场 ...
最新文章
- js中的preventDefault与stopPropagation详解
- php 图片预览原理,JavaScript_纯JS实现的批量图片预览加载功能,1.实现原理直接见代码,需要一 - phpStudy...
- phpstudy composer 安装YII2
- 【转】C# 操作系统防火墙
- pandas的dataframe节省内存
- Python 装饰器详解(上)
- 无人出价!贾跃亭所持2210万股乐视网股票首次拍卖流拍
- 【MyEcplise SVN】myEcplise上安装SVN的多种方式
- 2019春年第三次课程设计实验报告
- 10.1寸大屏安卓通用车载导航
- 关于PLC的输入输出点,源型漏型的判断
- 你说南京很好,但不是你最想去的城市,那么,上海呢,要不借这个机会去看看吧--写给自己
- java大作业网络聊天室
- 3d max 安装及激活教程
- win10轻松自动“备份和恢复”只要5步
- 打字慢能学计算机吗,提高电脑打字速度,实现快速盲打,这样的学习方法很管用!...
- python计算圆柱体积_如何用PYTHON计算体积公式
- CSS样式之块元素行内元素
- 大话西游2人数最多服务器,大话西游2四下服务器首只双终极黄金问世!修炼之路令人揪心...
- 推荐15款很棒的 JavaScript 开发工具