每日OJ题_牛客_AB20走迷宫_BFS_C++_Java

ops/2024/11/2 17:21:57/

目录

牛客_AB20走迷宫_BFS

题目解析

C++代码

Java代码


牛客_AB20走迷宫_BFS

走迷宫_牛客题霸_牛客网 (nowcoder.com)

描述:

        给定一个n×m的网格,在网格中每次在不超过边界的情况下可以选择向上、向下、向左、向右移动一格。网格中的一些格子上放置有障碍物,放有障碍物的格子不能到达。求从(xs,ys)(xs​,ys​)到(xt,yt)(xt​,yt​)最少的移动次数。若不能到达,输出−1。

输入描述:

        第一行输入两个整数n,mn,m (1≤n,m≤10001≤n,m≤1000),表示网格大小。
        第二行输入四个整数xs,ys,xt,ytxs​,ys​,xt​,yt​ (1≤xs,xt≤n1≤xs​,xt​≤n, 1≤ys,yt≤m1≤ys​,yt​≤m),表示起点和终点的坐标。
        接下来的n行,每行输入一个长度为m的字符串。其中,第i行第j个字符表示第i行第j列的格子上的障碍物情况,若字符为'*',则格子上有障碍物,若字符为'.',则格子上没有障碍物。保证起点不存在障碍物。

输出描述:

输出一行一个整数,表示从(xs,ys)(xs​,ys​)到(xt,yt)(xt​,yt​)最少的移动次数。


题目解析

  • 广度优先遍历,是一种层次遍历。它从起点开始,从上往下从左到右进行遍历。这种层次遍历,可以确保起点到终点的路径是 最短的最坏情况下,也就是将所有的节点遍历一次,才能找到终点。但是呢,广度优先遍历不太适用于找路径的条数,归根结底,还是因为一般的层次遍历,节点只知道自己当前所在的层次并不知道自己是由哪一个节点过来的。

  • 判断是两个坐标是否相同,相同返回零。
  • bfs广度优先搜索,用while循环将新创建的steps[][]进行层次遍历迭代。
  • 判断目标坐标内容是否发生改变,如果没有,那么无法bsf到该目标坐标,返回-1。

C++代码

#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;int n = 0, m = 0;
int x1, y1, x2, y2;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
bool vis[1007][1007];void bfs(vector<vector<char>>& vv, vector<vector<int>>& cnt)
{queue<pair<int, int>> q;q.push({x1, y1});vis[x1][y1] = true;while(q.size()){auto[a, b] = q.front();q.pop();if(a == x2 && b == y2)return;for(int i = 0; i < 4; ++i){int x = dx[i] + a, y = dy[i] + b;// cout << x << " " << y << endl;if(x <= n && x > 0 && y <= m && y > 0 && !vis[x][y] && vv[x][y] == '.'){q.push({x, y});vis[x][y] = true;cnt[x][y] = cnt[a][b] + 1;// cout << x << " " << y << endl;// cout << cnt << endl;}}}
}signed main()
{cin >> n >> m;cin >> x1 >> y1 >> x2 >> y2;vector<vector<char>> vv(n + 1, vector<char>(m + 1));vector<vector<int>> cnt(n + 1, vector<int>(m + 1));for(int i = 1; i <= n; ++i){for(int j = 1; j <= m; ++j){cin >> vv[i][j];}}if(vv[x1][y1] == '*' || vv[x2][y2] == '*'){cout << -1 << endl;return 0;}bfs(vv, cnt);// for(int i = 1; i <= n; ++i)// {//     for(int j = 1; j <= m; ++j)//     {//         cout << cnt[i][j] << " ";//     }//     cout << endl;// }if(cnt[x2][y2] == 0)cout << -1 << endl;elsecout << cnt[x2][y2] << endl;return 0;
}

Java代码

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{public static int N = 1010;public static int[] dx = {0, 0, 1, -1};public static int[] dy = {-1, 1, 0, 0};public static int n, m, x1, y1, x2, y2;public static char[][] arr = new char[N][N];public static int[][] dist = new int[N][N]; // 标记当前位置有没有搜索过,以及⾛到该位置时候的最短步数public static int bfs(){if(arr[x2][y2] == '*')return -1;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){dist[i][j] = -1; // 表明刚开始每个位置都没有搜索过}}Queue<int[]> q = new LinkedList<>();q.add(new int[]{x1, y1});dist[x1][y1] = 0;while(!q.isEmpty()){int[] t = q.poll();int a = t[0], b = t[1];for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 1 && x <= n && y >= 1 && y <= m && arr[x][y] == '.' &&  dist[x][y] == -1){q.add(new int[]{x, y});dist[x][y] = dist[a][b] + 1;if(x == x2 && y == y2){return dist[x][y];}}}}return -1;}public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt(); m = in.nextInt();x1 = in.nextInt(); y1 = in.nextInt();x2 = in.nextInt(); y2 = in.nextInt();for(int i = 1; i <= n; i++){String tmp = in.next();for(int j = 1; j <= m; j++){arr[i][j] = tmp.charAt(j - 1);}}System.out.println(bfs());}
}

http://www.ppmy.cn/ops/130475.html

相关文章

JVM 调优深度剖析:优化 Java 应用的全方位攻略(一)

这是我们就业陪跑训练营学员总结的文章&#xff0c;我觉得不错&#xff0c;和大家分享一下。 Java 应用中&#xff0c;JVM 调优至关重要。本文聚焦 JVM 调优&#xff0c;涵盖主要目标、思路与方法。目标包括减少 GC 停顿、提高吞吐量等&#xff1b; 思路有多步&#xff0c;如选…

智慧农业与道品科技:现代农业转型的创新之路

智慧农业是现代农业发展中不可忽视的重要领域。随着全球人口的持续增长和城市化进程的加快&#xff0c;传统农业面临着诸多挑战&#xff0c;包括资源短缺、环境污染、气候变化等。智慧农业作为一种新兴的农业经营模式&#xff0c;旨在通过先进的技术手段来提高农业生产效率、保…

2025秋招NLP算法面试真题(二十四)-实体库构建:大规模离线新词实体挖掘

在自然语言处理(NLP)任务中,命名实体识别(NER)通常涉及两个关键步骤:词典匹配和模型预测。词典匹配的优势在于速度快、准确性高,但由于词典的有限性,不同人群对相同实体的表达方式各异,导致新词(OOV)问题普遍存在。 为缓解OOV问题,可以通过模型预测提升泛化能力,…

​Java面试经典 150 题.P13. 罗马数字转整数(012)​

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int romanToInt(String s) {int sum…

Leetcode 热题100之二叉树2

1.二叉树的层序遍历 思路分析&#xff1a;层序遍历是逐层从左到右访问二叉树的所有节点&#xff0c;通常可以使用广度优先搜索&#xff08;BFS&#xff09;来实现。我们可以使用一个队列&#xff08;FIFO&#xff09;来存储每一层的节点&#xff0c;并逐层访问。 初始化队列&a…

【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!

文章目录 一、FastGPT大模型介绍1. 开发团队2. 发展史3. 基本概念 二、FastGPT与其他大模型的对比三、使用 Docker Compose 快速部署 FastGPT1、安装 Docker 和 Docker Compose&#xff08;1&#xff09;. 安装 Docker&#xff08;2&#xff09;. 安装 Docker Compose&#xff…

中阳智能投资系统:量化科技引领未来投资之路

在全球金融市场竞争激烈的大背景下&#xff0c;量化科技逐渐成为机构投资者和个人投资者的核心工具。中阳智能投资系统以数据驱动策略为核心&#xff0c;通过精准的模型算法与自动化交易技术&#xff0c;为用户提供全方位的智能投资服务。本文将探讨中阳智能投资系统的独特优势…

使用RabbitMQ实现微服务间的异步消息传递

使用RabbitMQ实现微服务间的异步消息传递 RabbitMQ简介 安装RabbitMQ 在Ubuntu上安装RabbitMQ 在CentOS上安装RabbitMQ 配置RabbitMQ 创建微服务 生产者服务 安装依赖 生产者代码 消费者服务 消费者代码 运行微服务 消息模式 直接模式 生产者代码 消费者代码 扇出模式 生产…