就是有一个迷宫还是地图的什么鬼东西,需要从左上角去往右上角,.表示可以走,X表示不可以走,然后如果出现数字n(1-9) 表示这个有一只小怪兽,你需要使用n秒钟来消灭它,然后问在这样的情况下至少需要多少秒才能出去,或者干脆出不去让上帝帮忙(两点不可达)。。。。。。
用普通的bfs即可,不过呢要稍微变一下下,假设数字都没有,那是最好的,如果有数字一旦走到这里就需要耽搁一定的时间。
我们可以这样想,一旦从队首却出来取出来的坐标点代表的是数字,那么我们入队列的时候,x和y不变,step(步数或者叫做秒数)增加,同时我们把这个数字减少,当这个数字变成0的时候,就等同于.,所以一旦从队首取出来的坐标点是.或者是0,那么就按照标准BFS的4个方向扫描,并确定入队关系。打印路径的时候,我为了方便先递归找到路径,然后用另一个函数格式化输出。千万不要遇到数字,就在队列中连续插入一堆坐标,即使是遇到数字9,也要一次一次慢慢的通过队列自然的循环插入这个坐标
样例1 动画演示:
相同颜色代表同一时间
PPS:之所以有两种代码,是因为不知道为什么,Java代码最开始path是一个数组,死活过不了,后来改成Vector才过了,我的天,不知道怎么办呢?所以我用了一下C++。两份代码思路完全一模一样,都是AC代码
C++版本:
///*************************************
///* IDE:CodeBlocks 16.01
///* Complier:mingw32-g++ C++11
///* Author:gscsdlz
///* Time:2016-08-06-11.28
///*************************************
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
Java版本:
import java.util.*;
import java.text.DecimalFormat;
import java.math.*;
class Node {
int x, y;
int step;
int id;
int pre;
boolean flag;
Node(int x, int y, int id, int step, int pre, boolean flag){
this.x = x;
this.y = y;
this.id = id;
this.step = step;
this.pre = pre;
this.flag = flag;
}
public String toString() {
return id + " " + x + " " + y + " " +step + " " + pre + " " + flag;
}
}
public class Main {
static int m, n;
static final int maxn = 100 + 5;
static char[][] maze = new char[maxn][maxn];
static boolean[][] vis = new boolean[maxn][maxn];
static int[][] dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
static Vectorans = new Vector();
static Vectorpath = new Vector();
static void getAns(int k) {
if(path.elementAt(k).pre != -1)
getAns(path.elementAt(k).pre);
ans.add(path.elementAt(k));
}
static void print() {
for(int i = 0; i < ans.size() - 1; ++i) {
if(ans.elementAt(i).flag == true) {
System.out.println(ans.elementAt(i).step+"s:FIGHT AT ("+ans.elementAt(i).x+","+ans.elementAt(i).y+")");
}
if(ans.elementAt(i + 1).flag == false) {
System.out.print((ans.elementAt(i).step + 1) + "s:");
System.out.print("(" + ans.elementAt(i).x + "," + ans.elementAt(i).y + ")->");
System.out.println("(" + ans.elementAt(i + 1).x + "," + ans.elementAt(i + 1).y + ")");
}
}
if(ans.lastElement().flag == true) {
System.out.println(ans.lastElement().step+"s:FIGHT AT ("+ans.lastElement().x+","+ans.lastElement().y+")");
}
}
static void bfs() {
Queue q = new LinkedList();
q.add(new Node(0, 0, 0, 0, -1, false));
vis[0][0] = true;
path.add(new Node(0, 0, 0, 0, -1, false));
while(q.isEmpty() == false) {
Node fr = q.remove();
if((fr.x + 1) == n && (fr.y + 1) == m && (maze[fr.x][fr.y] == '.' || maze[fr.x][fr.y] == '0')) {
System.out.println("It takes " + fr.step +" seconds to reach the target position, let me show you the way.");
ans.clear();
getAns(fr.id);
print();
System.out.println("FINISH");
return;
}
if('1' <= maze[fr.x][fr.y] && maze[fr.x][fr.y] <= '9') {
q.add(new Node(fr.x, fr.y, path.size(), fr.step + 1, fr.id, true));
path.add(new Node(fr.x, fr.y, path.size(), fr.step + 1, fr.id, true));
maze[fr.x][fr.y]--;
vis[fr.x][fr.y] = true;
} else {
for(int i = 0; i < 4; i++) {
int nx = fr.x + dir[i][0];
int ny = fr.y + dir[i][1];
if(0 <= nx && nx < n && 0 <= ny && ny < m && vis[nx][ny] == false && maze[nx][ny] != 'X') {
q.add(new Node(nx, ny, path.size(), fr.step + 1, fr.id, false));
path.add(new Node(nx, ny, path.size(), fr.step + 1, fr.id, false));
vis[nx][ny] = true;
}
}
}
}
System.out.println("God please help our poor hero.");
System.out.println("FINISH");
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while(cin.hasNextInt()) {
n = cin.nextInt();
m = cin.nextInt();
String tmp;
for(int i = 0; i < n; ++i) {
tmp = cin.next();
for(int j = 0; j < m; ++j)
maze[i][j] = tmp.charAt(j);
}
for(int i = 0; i < maxn; ++i)
Arrays.fill(vis[i], false);
bfs();
}
cin.close();
}
}