HDOJ1240 Asteroids!

題意:

首先一個字符Start N  1<=N<=10

接下來是一個char[N] [N] [N]的三維數組模型 每個地方不是X  就是O

X表示不可走  O表示可走

每次只能走同一層前後左右    不同層上下

接下來是倆行(起點   終點) 每行三個數0~N-1 分別表示  列  行  層

最後一個END字符爲一個實例

求起點到終點的最短時間 每移動一個加1  能到輸出N   最短時間

不能到則輸出

NO ROUTE

本題求最短時間 ,顯然用廣搜:廣搜原理點此


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();
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章