牛客网——Kotori和迷宫

2023-10-28 17:20
文章标签 牛客 迷宫 kotori

本文主要是介绍牛客网——Kotori和迷宫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Kotori和迷宫

  • 题目
    • 输入描述
    • 输出描述
  • 思路
  • 代码
  • 结果

题目

kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能到达的,最近的出口离她有多远?
题目传送门

输入描述

第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30)

后面紧跟着n行长度为m的字符串来描述迷宫。‘k’代表kotori开始的位置,’.‘代表道路,’*'代表墙壁,'e’代表出口。保证输入合法。

输出描述

若有出口可以抵达,则输出2个整数,第一个代表kotori可选择的出口的数量,第二个代表kotori到最近的出口的步数。(注意,kotori到达出口一定会离开迷宫)

若没有出口可以抵达,则输出-1。

思路

因为要找到所有出口数,而且要找到最小的那个,用广搜比较好【深度搜索也可以,只是每次都要去比较最优数值,比较麻烦】,广搜第一次出现的出口就是最优的那个。

只要到了出口了,就不能往下广搜了【题目只要到了出口就会离开】,所以要将队头节点给弹出去。

用一个count来计算总路径数目,用一个flag来标记是否找到了路径。方便最终结果的打印。

代码

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;class  Point{int x;int y;int step;
}
public  class Main{static int n;//行数static int m;//列数//出发横纵坐标static int start_x;static int start_y;static int min=Integer.MAX_VALUE;//最小出口static boolean flag=false;static int count;//出口个数//右下左上static int d_x[]={0,1,0,-1};static int d_y[]={1,0,-1,0};static int visited[][]=new int[40][40];static char map[][]=new char[40][40];static Queue<Point> queue =new LinkedList();public static void main(String[] args) {Scanner reader=new Scanner(System.in);n=reader.nextInt(); //行数m=reader.nextInt(); //列数queue.clear();String blank=reader.nextLine();//接收空白回车符char temp;for (int i=1;i<=n;++i){String test=reader.next();for (int j=1;j<=m;++j){temp=test.charAt(j-1);map[i][j]=temp;if (temp=='k'){start_x=i;start_y=j;}}}Point start=new Point();start.x=start_x;start.y=start_y;start.step=0;visited[start_x][start_y]=1;queue.offer(start);while (!queue.isEmpty()){int x=queue.peek().x;int y=queue.peek().y;int step=queue.peek().step;if (map[x][y]=='e'){++count;if (!flag)//第一次找到路径一定是最短的{min=step;flag=true;}queue.poll();continue;}for (int i=0;i<=3;++i){int temp_x=x+d_x[i];int temp_y=y+d_y[i];if(check(temp_x,temp_y)){Point g=new Point();g.step=step+1;g.x=temp_x;g.y=temp_y;visited[temp_x][temp_y]=1;queue.offer(g);}}queue.poll();}//找得到路径,可以输出if (flag)System.out.println(count+" "+min);else //输出-1System.out.println("-1");}public static boolean check(int a,int b){return a>=1 && a<=n && b>=1 && b<=m && (map[a][b]=='.' || map[a][b]=='e') && visited[a][b]==0;}
}

结果

在这里插入图片描述
对于迷宫广搜的模板,现在应该算是比较熟悉了,加油

这篇关于牛客网——Kotori和迷宫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

nyoj306(走迷宫)

走迷宫 时间限制: 1000 ms  |  内存限制: 65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。 这个迷宫可以向上走,向

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

 示例:基于抽象工厂的迷宫   实现:     如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu