1101. 献给阿尔吉侬的花束

2024-03-21 10:20

本文主要是介绍1101. 献给阿尔吉侬的花束,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem: 1101. 献给阿尔吉侬的花束

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这道题目让我们求出开始点S到结束点E的最短路径,题目中说,字符 S 表示阿尔吉侬所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。我们可以将起点和终点看作是两个不同的状态,然后使用BFS来搜索最短的路径。在搜索的过程中,我们需要记录到达每个状态的最小代价

解题方法

定义一个二维数组matrix来表示迷宫的布局:S表示起点,E表示终点,#表示墙壁,.表示可以通行的空地。
从输入中读取迷宫的行数x和列数y。
使用一个循环读取迷宫的每一行,并将其存储在matrix中。
使用两个变量startx和starty来记录起点的坐标,使用两个变量endx和endy来记录终点的坐标。遍历迷宫,当找到S时,将其坐标赋值给startx和starty;当找到E时,将其坐标赋值给endx和endy。
创建一个二维数组vis来记录到达每个状态的最小代价。初始化vis的所有元素为-1,表示尚未访问过。
创建一个队列queue来进行BFS搜索。将起点的坐标(startx, starty)添加到队列中,并将其代价vis[startx][starty]设置为0。
进入循环,直到队列为空为止。每次从队列中取出一个状态,记为当前位置(nx, ny)。
遍历当前位置的上、下、左、右四个相邻位置,记为(dx, dy)。
对于每个相邻位置(dx, dy),进行如下判断:
如果(dx, dy)超出了迷宫的边界,或者已经访问过(vis[dx][dy]!=-1),或者是墙壁(matrix[dx][dy]==‘#’),则忽略该相邻位置,继续循环。
否则,将相邻位置(dx, dy)的代价值vis[dx][dy]更新为当前位置(nx, ny)的代价值vis[nx][ny]+1,并将相邻位置(dx, dy)添加到队列中。
如果相邻位置(dx, dy)恰好是终点的位置(endx, endy),则返回其代价值vis[dx][dy],即为最短路径的长度。
如果循环结束后仍未找到终点,说明不存在从起点到终点的路径,返回-1

复杂度

时间复杂度:

O ( x ∗ y ) O(x * y) O(xy),其中x和y分别为迷宫的行数和列数。由于需要遍历整个迷宫,时间复杂度为 O ( x ∗ y ) O(x * y) O(xy)

空间复杂度:

O ( x ∗ y ) O(x * y) O(xy),其中 x x x y y y分别为迷宫的行数和列数。需要使用数组 v i s vis vis来记录到达每个状态的最小代价,所以空间复杂度为 O ( x ∗ y ) O(x * y) O(xy)

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int t, x, y, step = 0;static int MAXR = 210;static char[][] matrix = new char[MAXR][MAXR];static int l, r;
//	static int[][] queue = new int[MAXR][2];static int[][] vis = new int[MAXR][MAXR];static int[][] move = { {}, { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };static Queue<int[]> queue = new LinkedList<>();public static void main(String[] args) throws IOException {t = nextInt();for (int a = 0; a < t; a++) {x = nextInt();y = nextInt();
// 			in.readLine();for (int i = 0; i < x; i++) {matrix[i] = in.readLine().toCharArray();}int startx = 0, starty = 0, endx = 0, endy = 0;for (int i = 0; i < x; i++) {for (int j = 0; j < y; j++) {if (matrix[i][j] == 'S') {startx = i;starty = j;} else if (matrix[i][j] == 'E') {endx = i;endy = j;}}}int res = bfs(startx, starty, endx, endy);out.println(res == -1 ? "ops!" : res);}out.flush();}private static int bfs(int startx, int starty, int endx, int endy) {// TODO Auto-generated method stubfor (int i = 0; i < x; i++) {Arrays.fill(vis[i], -1);}queue.clear();queue.offer(new int[] { startx, starty });vis[startx][starty] = 0;while (!queue.isEmpty()) {int[] arr = queue.poll();int nx = arr[0];int ny = arr[1];// 开枝散叶for (int i = 1; i <= 4; i++) {int dx = nx + move[i][0];int dy = ny + move[i][1];// 边界判断if (dx >= x || dy >= y || dx < 0 || dy < 0 || vis[dx][dy] != -1 || matrix[dx][dy] == '#')continue;vis[dx][dy] = vis[nx][ny] + 1;if (dx == endx && dy == endy) {return vis[dx][dy];}queue.offer(new int[] { dx, dy });}}return -1;}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}

这篇关于1101. 献给阿尔吉侬的花束的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832418

相关文章

献给正在学习IT专业的朋友们

1.首先请你热爱这个专业。只有这样,你才会从抽象的理论中找到实实在在的快乐。如果 你不热爱她,或者只因为这是个热门专业,那么极力要求你放弃这个专业,因为计算机是 一把双刃剑,学好了你会飞黄腾达,学不好你毕业后会极其痛苦,高不成低不就,没有发 展潜力,如同学英语专业的人到了美国一样。 2.不要用功利眼光对待这个学科,这绝对不是点点鼠标就能挣钱的专业。不要去想做

献给所有的黑客新手

早已经习惯熬夜的我,今天,我学到很多东西,也明白很多,所以写下此文。 我没有师傅,也没有拜过师,只有老师,是现实生活中遇到的计算机老师,并非网上找的所谓的“高手”,有人问过我,没有师傅怎么学习?难道学习技术就一定要找师傅吗?找师傅你们的条件就是技术好,无非就是多入侵了几个站的,试问他们能帮助你们什么?帮助引导你们犯罪吗?再说高一点,就是一些精通一门甚至几门技术的,他们是真正高手,但是他

练习1101

//查找介于n1与n2之间( 0<n1<n2<32768 )之间所有满足下列条件的整数 //1,该数的十进制表示中有且仅有相同的两个数 //2,该数为素数 //现判断条件1,然后在条件1的函数中判断条件2 #include <stdio.h> void compare (int x , int y );//该函数判断是否有两个相同的数 void pr

程序员真的是吃青春饭的吗?(献给即将进入职场的程序员们)--------非原著

又有学生问我:程序员真的是吃青春饭的吗?我是不是做到三十岁就该考虑转型了? 我告诉他们: 这是中国的记者们用统计数字造下的一个弥天大谎,当我们看到微软集团内的许多白发程序员在兢兢业业地工作的时候,我们又用"观念"来说明中国的程序员吃青春饭的原因。实际上,不仅美国的微软,甲骨文,Adobe,暴雪,在中国的金山,寰宇,腾讯,盛大,都有或者将要有年龄很大的程序员,关键是他们做的东西和那些"挨

献给阿尔吉侬的花束(信息学奥赛一本通-T1256)

【题目描述】 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。 迷宫用一个R×C的字符矩阵来表示。字符S表示阿尔吉侬所在的位置,字符E表示奶酪所在的位置,字符#表示墙壁,字符.表示可以通行。阿尔吉侬在

POJ - 1101 The Game DFS

题目链接 #include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<math.h>#include<algorithm>#include<vector>#include<queue>using namespace std;const int maxn = 505;co

hdu-1290-献给杭电五十周年校庆的礼物

#include<stdio.h> int main() { int n; while(scanf("%d",&n)!=EOF) printf("%d\n",(n*n*n+n*5)/6+1); return 0; }

献给那些前端学习迷茫的人 -----前端开发必备的11项技能!!!

你也许会觉得前端开发是一个很简单的工作,对呀,你就是刚刚从网页设计转型过来的。但当你深入其中时,一定会发现好像前端开发不是那么简单,光网站性能优化、响应式、框架就让你焦头烂额,        确实,做前端开发就是先易后难,想成为一个优秀的前端开发,没有那么简单。        不过,天下事难则不会,会则不难,你只需要掌握11项技能就可以成为前端“大拿”,下面,就告诉你这11项技能

python 和 MATLAB 都能绘制的母亲节花束!!

hey 母亲节快到了,教大家用python和MATLAB两种语言绘制花束~这段代码是我七夕节发的,我对代码进行了简化,同时自己整了个python版本 MATLAB 版本代码 function roseBouquet_M()% @author : slandarer% 生成花朵数据[xr,tr]=meshgrid((0:24)./24,(0:0.5:575)./575.*20.*pi+

九度 1101 - 字符串处理 - 计算表达式

根据我的通过来看,首先这道题里面没有小数,如果存在除不尽的情况,也是按取整来算。 本题建立了两个栈,一个存储数字的数字栈,一个存储加减乘除的符号栈。在处理字符串的时候,每次找到一个数字时,放进一个string的临时变量里,因为会存在十位以上的情况;每次找到一个符号时,首先将string变量转int放入数字栈,然后检查符号栈的栈顶符号是否为乘或者除,如果是就从符号栈弹出顶,从数字栈弹出两个数,计算