给一个矩阵,每个格子上有三种可能,空房,阻碍物或者是保安,阻碍物不能进,空房
四个方向都能进,要写代码给每个空房标记其离最近的保安的距离,比如
000
BGG
B00
B表示障碍物,G表示保安,0表示空房,应该标记为
211
BGG
B11
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;public class xddd {
/**
* @param args
*/
class Node{
int x, y;
int step;
Node(int x, int y, int step){
this.x = x;
this.y = y;
this.step = step;
}
}char[][] martrix ;
int[][] stepArr = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
public xddd() {
// TODO Auto-generated constructor stub
martrix = new char[][]{{‘0‘,‘0‘,‘0‘},{‘B‘,‘G‘,‘G‘},{‘B‘,‘0‘,‘0‘}};
}public static void printmar(char[][] martrix){
for(int i=0; i<martrix.length;i++){
System.out.println(" ");
for(int j=0; j<martrix[0].length; j++)
System.out.print(martrix[i][j]);
}}
public int bfs(char[][] martrix, int ix, int iy){
int[][] visit = new int[3][3];//标记是否已经访问过Node node = new Node(ix, iy, 0);
Queue<Node> queue = new LinkedList<Node>();
queue.offer(node);
int M = martrix.length;
int N = martrix[0].length;
while(!queue.isEmpty()){
Node head = queue.poll();
visit[head.x][head.y] = 1;
for(int i = 0; i < 4; i++){
int x = head.x + stepArr[i][0];
int y = head.y + stepArr[i][1];
//exit
if(x >= 0 && x < M && y >= 0 && y < N &&martrix[x][y] == ‘G‘){
return head.step+1;
}
//bfs
if(x >= 0 && x < M && y >= 0 && y < N &&martrix[x][y] == ‘0‘ && visit[x][y] == 0){System.out.println(x + " " +y + head.step);
Node newNode = new Node(x, y, head.step + 1);
queue.offer(newNode);
}}
}
return -1;
}public static void main(String[] args) {
// TODO Auto-generated method stub
xddd x = new xddd();
printmar(x.martrix);
char[][] ret = new char[3][3];
for(int i=0; i<x.martrix.length;i++){
System.out.println(" ");
for(int j=0; j<x.martrix[0].length; j++){
if(x.martrix[i][j] != ‘0‘)
ret[i][j] = x.martrix[i][j];
else{
ret[i][j] = (char)(‘0‘ + x.bfs(x.martrix,i,j));
}
}}
printmar(ret);
}}
o g 寻找最短
时间: 2024-10-10 14:01:31
o g 寻找最短的相关文章
最短任务调度算法
1 package com.mmall.common.program; 2 3 import java.util.Map; 4 import java.util.Scanner; 5 import java.util.TreeMap; 6 7 /** 8 * Created by Workstation on 2017/8/23. 9 * 实现最短任务调度算法,求其中平均等待时间 10 */ 11 public class SJB { 12 13 public static void main
hdu1372 BFS求最短路径长度
C - 广搜 基础 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the
【转】八数码问题及A*算法
一.八数码问题八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤.所谓问题的一个状态就是棋子在棋盘上的一种摆法.棋子移动后,状态就会发生改变.解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态.八数码问题一般使用搜索法来解.搜索法有广度优先搜索法.深度优
最短路径之 Dijkstra模板
一:时间复杂度为O(V*V)的Dijkstra const int Max_v = 100 + 10; const int INF = 1<<30; int cost[Max_v][Max_v];//权值 int d[Max_v];//顶点s出发最短距离 bool used[Max_v];//以使用过的图 int V;//顶点数 int Edge;//边数 void dijkstra(int s) { fill(d,d+V,INF); fill(used,used+V,false); d[s]
结对项目—地铁出行路线规划
结对项目—地铁出行路线规划 我的搭档:陈鸿超 14061216 https://github.com/ChengFR/PairProgramming_SubwayRoute- 会在十一期间发布新版本 结对编程体会: 结对编程的优点: 站在软件开发的角度,两个人共同面对同一台电脑进行开发,无论是效率还是软件质量都要超过一个人进行开发的情况. 对于还处于学习阶段的年轻软件开发者来说,结对编程是一个很好的互相学习的机会 结对编程时动力.责任感更强 结对编程的缺点: 对于我们来说,寻找两个人共同的时间进
最短路 HDU 2544
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 50686 Accepted Submission(s): 22280 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最
九宫格问题 A*
八数码问题 一.八数码问题八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤.所谓问题的一个状态就是棋子在棋盘上的一种摆法.棋子移动后,状态就会发生改变.解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态.八数码问题一般使用搜索法来解.搜索法有广度优先搜
近十年one-to-one最短路算法研究整理【转】
前言:针对单源最短路算法,目前最经典的思路即标号算法,以Dijkstra算法和Bellman-Ford算法为根本演进了各种优化技术和算法.针对复杂网络,传统的优化思路是在数据结构和双向搜索上做文章,或者针对不必要的循环进行排除.近年来,最短路算法大量应用于需要高及时性的领域,比如GIS领域,也大量应用于网络规模巨大的社会网络分析领域,这使得传统思路并不能很好地解决,于是把最短路算法思路本身抽象成两阶段算法,第一阶段为数据预处理,第二阶段为实时地搜索.这二者是互相矛盾的,如何找到平衡是各种算法技术
【每日算法】图算法(遍历&;MST&;最短路径&;拓扑排序)
图有邻接矩阵和邻接表两种存储方法,邻接矩阵很简单,这里不讨论,下面我们先看看常用的邻接表表示方法. 邻接表常用表示方法 指针表示法 指针表示法一共需要两个结构体: struct ArcNode //定义边表结点 { int adjvex: //邻接点域 ArcNode* next; }; struct VertexNode //定义顶点表结点 { int vertex; ArcNode* firstedge; }; 每个节点对应一个VertexNode,其firstedge指向边表(与当前节点邻