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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值