題意:
首先一個字符Start N 1<=N<=10
接下來是一個char[N] [N] [N]的三維數組模型 每個地方不是X 就是O
X表示不可走 O表示可走
每次只能走同一層前後左右 不同層上下
接下來是倆行(起點 終點) 每行三個數0~N-1 分別表示 列 行 層
最後一個END字符爲一個實例
求起點到終點的最短時間 每移動一個加1 能到輸出N 最短時間
不能到則輸出
本題求最短時間 ,顯然用廣搜:廣搜原理點此
import java.util.LinkedList;
import java.util.Scanner;
public class P1240 {
static int n;
static Block[][][] blocks=new Block[10][10][10];
static BlockQueue queue;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);//new數組
for (int i = 0; i < blocks.length; i++) {
for (int j = 0; j < blocks[i].length; j++) {
for (int k = 0; k < blocks[i][j].length; k++) {
blocks[i][j][k]=new Block(i, j, k, 'X');
}
}
}
while(sc.hasNext()){
sc.next();
n=sc.nextInt();
for (int i = 0; i < n; i++) {//初始化
for (int j = 0; j < n; j++) {
String str=sc.next();
for (int k = 0; k < n; k++) {
blocks[i][j][k].c=str.charAt(k);
blocks[i][j][k].time=0;
blocks[i][j][k].isVisit=false;
}
}
}
queue=new BlockQueue();
int column =sc.nextInt();
int row =sc.nextInt();
int slice =sc.nextInt();
Block start=blocks[slice][row][column];
column =sc.nextInt();
row =sc.nextInt();
slice =sc.nextInt();
Block end=blocks[slice][row][column];
sc.next();
if(start.x==end.x&&start.y==end.y&&start.z==end.z){
System.out.println(n+" "+0);
continue;
}
start.isVisit=true;
queue.push(start);
searchBFS(end);
}
}
static int[][] dir={{0,1,0},{0,-1,0},//所走途徑
{0,0,1},{0,0,-1},
{1,0,0},{-1,0,0}};
private static void searchBFS(Block end) {
while(!queue.isEmpty()){//廣搜
Block b=queue.pop();
for (int i = 0; i < dir.length; i++) {
int x=b.x+dir[i][0];
int y=b.y+dir[i][1];
int z=b.z+dir[i][2];
if(x>=0&&x<n && y>=0&&y<n && z>=0&&z<n &&
!blocks[x][y][z].isVisit && blocks[x][y][z].c!='X'){
blocks[x][y][z].time=b.time+1;
if(x==end.x&&y==end.y&&z==end.z){
System.out.println(n+" "+end.time);
return;
}
blocks[x][y][z].isVisit=true;
queue.push(blocks[x][y][z]);
}
}
}
System.out.println("NO ROUTE");
}
static class Block {//方塊信息
int x, y,z, time;
char c;
boolean isVisit;
public Block(int x, int y, int z,char c) {
this.x = x;
this.y = y;
this.z = z;
this.c = c;
}
}
static class BlockQueue {//隊列
LinkedList<Block> lkl=new LinkedList<Block>();
public void push(Block b){
lkl.add(b);
}
public Block pop(){
return lkl.pollFirst();
}
public boolean isEmpty(){
return lkl.isEmpty();
}
}
}