[蓝桥杯2015决赛]穿越雷区-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

知识点:
gets()和scanf()的区别在于输入的字符串是否中间有空格:对于前者,只有遇到"\n"时才停止输入,而对于后者,出现"\n"或空格都停止输入。

AC代码如下:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 110;
typedef pair<int, int>PII;
#define x first
#define y second
char g[N][N];
int dis[N][N];
bool st[N][N];
int n;int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};int bfs(PII start, PII end) {queue<PII>q;q.push(start);dis[start.x][start.y] = 0;st[start.x][start.y] = true;while (q.size()) {PII t = q.front();q.pop();for (int i = 0; i < 4; i++) {int xx = t.x + dx[i], yy = t.y + dy[i];if (xx < 0 || xx >= n || yy < 0 || yy >= n)continue;if (st[xx][yy])continue;if (g[xx][yy] == g[t.x][t.y])continue;st[xx][yy] = true;dis[xx][yy] = dis[t.x][t.y] + 1;if (end == make_pair(xx, yy))return dis[xx][yy];q.push({xx, yy});}}return -1;
}int main() {cin >> n;PII start, end;memset(dis, -1, sizeof(dis));for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cin >> g[i][j];//因为cin输入遇到空格会停下,所以用二重循环来读入if (g[i][j] == 'A')start = {i, j};else if (g[i][j] == 'B')end = {i, j};}}int distance = bfs(start, end);if (distance == -1)cout << -1 << endl;elsecout << distance << endl;return 0;}

错误代码如下:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 110;
typedef pair<int, int>PII;
#define x first
#define y second
char g[N][N];
int dis[N][N];
bool st[N][N];
int n;int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};int bfs(PII start, PII end) {queue<PII>q;q.push(start);dis[start.x][start.y] = 0;st[start.x][start.y] = true;while (q.size()) {PII t = q.front();q.pop();for (int i = 0; i < 4; i++) {int xx = t.x + dx[i], yy = t.y + dy[i];if (xx < 0 || xx >= n || yy < 0 || yy >= n)continue;if (st[xx][yy])continue;if (g[xx][yy] == g[t.x][t.y])continue;st[xx][yy] = true;dis[xx][yy] = dis[t.x][t.y] + 1;if (end == make_pair(xx, yy))return dis[xx][yy];q.push({xx, yy});}}return -1;
}int main() {cin >> n;PII start, end;memset(dis, -1, sizeof(dis));for (int i = 0;i<n;i++){
//		scanf("%s",g[i]);cin>>g[i];//这两种输入写法,都会遇到空格就停下来for (int j = 0;j<n;j++){if (g[i][j]=='A') start = {i,j};else if (g[i][j]=='B') end = {i,j};}}int distance = bfs(start, end);if (distance == -1)cout << -1 << endl;elsecout << distance << endl;return 0;}

AC代码如下:

#include <iostream>
#include <queue>
using namespace std;
const int N = 110;
bool vis[N][N];
char g[N][N];struct node
{int x,y;int p;
};int n;int dx[] ={0,0,1,-1},dy[] = {1,-1,0,0};int bfs(node s,node e)
{queue<node>q;q.push(s);vis[s.x][s.y] = true;while(q.size()){node t = q.front();q.pop();if (t.x == e.x && t.y==e.y){return t.p;}for (int i = 0;i<4;i++){int xx = t.x+dx[i],yy =t.y+dy[i];if (xx <0 || xx>= n || yy < 0 || yy >= n || vis[xx][yy]) continue;if (g[xx][yy]==g[t.x][t.y]) continue;vis[xx][yy] = true;node n;n = {xx,yy,t.p+1};q.push(n);}}return -1;
}int main()
{cin>>n;node s,e;for (int i = 0;i<n;i++)for (int j = 0;j<n;j++)cin>>g[i][j];for (int i = 0;i<n;i++)for (int j = 0;j<n;j++){if (g[i][j]=='A')s = {i,j,0};if  (g[i][j]=='B')e = {i,j,0};}cout<<bfs(s,e)<<endl;return 0;
}

错误代码如下:

下面这个代码为什么不行呢?因为int n两次了,一次在main函数外,一次在main函数里面,有时候写代码快的时候,容易发生这样的错误,还比较难找到。

#include <iostream>
#include <queue>
using namespace std;
const int N = 110;
bool vis[N][N];
char g[N][N];struct node
{int x,y;int p;
};int n;
int dx[] ={0,0,1,-1},dy[] = {1,-1,0,0};int bfs(node s,node e)
{queue<node>q;q.push(s);vis[s.x][s.y] = true;while(q.size()){node t = q.front();q.pop();if (t.x == e.x && t.y==e.y){return t.p;}for (int i = 0;i<4;i++){int xx = t.x+dx[i],yy =t.y+dy[i];if (xx <0 || xx>= n || yy < 0 || yy >= n || vis[xx][yy]) continue;if (g[xx][yy]==g[t.x][t.y]) continue;vis[xx][yy] = true;node n;n = {xx,yy,t.p+1};q.push(n);}}return -1;
}int main()
{int n;cin>>n;node s,e;for (int i = 0;i<n;i++)for (int j = 0;j<n;j++)cin>>g[i][j];for (int i = 0;i<n;i++)for (int j = 0;j<n;j++){if (g[i][j]=='A')s = {i,j,0};if  (g[i][j]=='B')e = {i,j,0};}cout<<bfs(s,e)<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word List 17

word List 17 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

pb 如何导出csv_如何计算指数温度?

指数温度的高低与价格高低没有必然的联系&#xff0c;指数温度的高低反映的是在历史中低于指数当前估值出现的概率。温度越低说明在历史上低于当前估值的概率越小&#xff0c;指数的价值越被低估&#xff0c;上涨的概率越大&#xff1b;温度越高说明在历史上低于当前估值的概率…

[蓝桥杯]地宫取宝

X 国王有一个地宫宝库&#xff0c;是 nm 个格子的矩阵&#xff0c;每个格子放一件宝贝&#xff0c;每个宝贝贴着价值标签。 地宫的入口在左上角&#xff0c;出口在右下角。 小明被带到地宫的入口&#xff0c;国王要求他只能向右或向下行走。 走过某个格子时&#xff0c;如果…

算法问题---两艘船是否有最大承载量

算法问题—两艘船是否有最大承载量 代码&#xff1a; 栈代码&#xff1a; #pragma once #include<stdio.h> #define maxSize 100 typedef struct stack {int * base;int * top; }stack; bool init(stack & Stack) {//栈的初始化Stack.base new int[maxSize];if (…

python标准库time_Python 标准库之时间篇

写在之前 大家好&#xff0c;这是首发在我公众号「Python空间」的第 69 篇文章&#xff0c;欢迎关注&#xff0c;期待和你的交流。 在昨天的文章&#xff08;Python 标准库之日期&#xff09;中我们学习了 Python 标准库中「日期 & 时间」中的「日期」&#xff0c;本来想昨…

《ASP.NET Core 微服务实战》-- 读书笔记(第12章)

第 12 章 设计汇总微服务开发并不是要学习 C#、Java 或者 Go 编程--而是要学习如何开发应用以适应并充分利用弹性伸缩环境的优势&#xff0c;它们对托管环境没有偏好&#xff0c;并能瞬间启停换句话说&#xff0c;我们要学习如何开发云原生应用识别并解决反模式我们既然已经学习…

[蓝桥杯2017初赛]纸牌三角形-枚举permutation+数论

题目描述 A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形&#xff08;A按1计算&#xff09;。要求每个边的和相等。 下图就是一种排法这样的排法可能会有很多。 如果考虑旋转、镜像后相同的算同一种&#xff0c;一共有多少种不同的排法呢&#xff1f; 输出 输出一个整数表示答…

算法----最大承载量下的最大价值问题

算法----最大承载量下的最大价值问题 代码&#xff1a; 栈代码&#xff1a;&#xff08;存储哪些是需要的价值物&#xff09; #pragma once #include<stdio.h> #define maxSize 100 typedef struct stack {int * base;int * top; }stack; bool init(stack & Stack…

oracle多条件分组统计_多条件统计,就必须用Ifs系列函数,绝对的高能!

数据统计&#xff0c;我们并不陌生&#xff0c;但是在实际的工作或应用中&#xff0c;数据统计都是附加条件的&#xff0c;而且大多情况下是“多条件”的&#xff0c;此时&#xff0c;我们必须掌握“Ifs”系列函数。一、多条件判断&#xff1a;Ifs函数。功能&#xff1a;判断指…

AcWing 895. 最长上升子序列

给定一个长度为N的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1≤N≤1000&#xff0c; −10^9≤数列中的数≤ 10…

word List18

word List18 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

matlab求logistics映射 的le_高维映射 与 核方法(Kernel Methods)

高维映射跟核方法的概念很容易混淆。高维映射通过将样本从原始空间映射到一个更高维的特征空间&#xff0c;从而解决了低纬下难以解决的问题。核方法往往跟高维映射配合使用&#xff0c;可以看做是一种技巧&#xff0c;可以通过它来避免这种映射的计算。下面详细介绍一下这两个…

AcWing 1015. 摘花生

Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所有的花生。…

干货,不小心执行了rm -f,除了跑路,如何恢复?

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

数据结构----二叉树叶子结点到根节点的高度计算

数据结构----二叉树叶子结点到根节点的高度计算 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {int data;struct bstTree* lchild, *rchild; }bstTree; void createBSTTree(bstTree* & T, int data) {//创建二叉排序树bst…

《三体》中的“维度”

《三体》里描述了这样的一个故事&#xff1a;当地球和三体星的坐标都暴露在宇宙之下时&#xff0c;歌者文明向太阳系发了一片二向箔&#xff0c;包括地球在内的太阳系文明全部降成二维&#xff0c;一切烟消云散。我们生存在三维空间&#xff0c;一旦把我们扔到了二维空间&#…

nginx 带宽_前端工程师不可不知的Nginx知识

历史背景互联网的全球化导致了互联网的数据量快速增长&#xff0c;加上在本世纪初摩尔定律在单核 CPU 上的失效&#xff0c;CPU 朝着多核方向发展&#xff0c;而 Apache 显然并没有做好多核架构的准备&#xff0c;它的一个进程同一时间只能处理一个连接&#xff0c;处理完一个请…

网格路径最小数字和

给定一个包含非负整数的 m x n 网格&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 数据范围&#xff1a; n < 100,m < 100; 输入&#xff1a; 3 3 1 3 1 1 5 1 4 2 1 输出&a…

word List 19

word List 19 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

矩形法_字体设计 | 新手必学,超简单的矩形造字法!!

点击蓝字关注&#xff0c;创智助你长姿势作为一个刚刚踏入设计界的“萌新”来说&#xff0c;字体设计可能是除了版式设计之外最简单的功课了&#xff0c;那么今天教学内容就是最简单的字体设计&#xff1a;矩形造字法。矩形造字法是以软件中的“矩形工具”为基础&#xff0c;以…