HDU1253 勝利大逃亡 (三維bfs)

Ignatius被魔王抓走了,有一天魔王出差去了,這但是Ignatius逃亡的好機會. 

魔王住在一個城堡裏,城堡是一個A*B*C的立方體,能夠被表示成A個B*C的矩陣,剛開始Ignatius被關在(0,0,0)的位置,離開城堡的門在(A-1,B-1,C-1)的位置,如今知道魔王將在T分鐘後回到城堡,Ignatius每分鐘能從一個座標走到相鄰的六個座標中的其中一個.如今給你城堡的地圖,請你計算出Ignatius可否在魔王回來前離開城堡(只要走到出口就算離開城堡,若是走到出口的時候魔王恰好回來也算逃亡成功),若是能夠請輸出須要多少分鐘才能離開,若是不能則輸出-1. 

Input輸入數據的第一行是一個正整數K,代表測試數據的數量.每組測試數據的第一行是四個正整數A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它們分別表明城堡的大小和魔王回來的時間.而後是A塊輸入數據(先是第0塊,而後是第1塊,第2塊......),每塊輸入數據有B行,每行有C個正整數,表明迷宮的佈局,其中0表明路,1表明牆.(若是對輸入描述不清楚,能夠參考Sample Input中的迷宮描述,它表示的就是上圖中的迷宮) 

特別注意:本題的測試數據很是大,請使用scanf輸入,我不能保證使用cin能不超時.在本OJ上請使用Visual C++提交. 
Output對於每組測試數據,若是Ignatius可以在魔王回來前離開城堡,那麼請輸出他最少須要多少分鐘,不然輸出-1. 
Sample Inputjava

1
3 3 4 20
0 1 1 1
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 1
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0

Sample Output佈局

11

對java不友好啊,加個快速輸入輸出

代碼:
import java.util.*;
import java.util.Comparator;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;
 class Node{
         int x;
         int y;
         int z;
         int step;
         public Node(int x,int y,int z,int step){
                 this.x=x; this.y=y; this.z=z;
                 this.step=step;
         }
 }
public class Main{
    static class FastScanner{//快速輸入
        BufferedReader br;
        StringTokenizer st;
        public FastScanner(InputStream in) {
          br = new BufferedReader(new InputStreamReader(in),16384);
          eat("");
        }
        public void eat(String s) {
          st = new StringTokenizer(s);
        }
        public String nextLine() {
          try {
              return br.readLine();
          } catch (IOException e) {
              return null;
          }
        }
        public boolean hasNext() {
          while(!st.hasMoreTokens()) {
              String s = nextLine();
              if(s==null) return false;
              eat(s);
          }
          return true;
        }
        public String next() {
          hasNext();
          return st.nextToken();
        }
        public int nextInt() {
          return Integer.parseInt(next());
        }
    }
    static FastScanner scan = new FastScanner(System.in);//輸入
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));//輸出
        static final int N=55;
        static  int map[][][]=new int[N][N][N];
        static int a,b,c,T;
        static boolean vis[][][]=new boolean[N][N][N];
        static ArrayDeque<Node> q=new ArrayDeque<Node>();
        static int dx[]={1,-1,0,0,0,0};
        static int dy[]={0,0,1,-1,0,0};
        static int dz[]={0,0,0,0,1,-1};
        static int bfs(){
                while(!q.isEmpty()) q.poll();
                vis[0][0][0]=true;
                q.offer(new Node(0,0,0,0));
                while(!q.isEmpty()){
                        Node s=q.poll();
                        if(s.x==a-1 && s.y==b-1 &&s.z==c-1 &&s.step>T)   return -1;
                        if(s.x==a-1 && s.y==b-1 &&s.z==c-1 &&s.step<=T) return s.step;
                        for(int i=0;i<6;i++){
                                int xx=s.x+dx[i];
                                int yy=s.y+dy[i];
                                int zz=s.z+dz[i];
                                if(xx<0||yy<0||zz<0||xx>=a||yy>=b||zz>=c) continue;
                                if(vis[xx][yy][zz]||map[xx][yy][zz]==1) continue;
                                vis[xx][yy][zz]=true;
                                q.offer(new Node(xx,yy,zz,s.step+1));
                        }
                }
                return -1;
        }
        public static void main(String[] args) {
//                Scanner scan=new Scanner(System.in);
                int t=scan.nextInt();
                while(t-->0){
                        a=scan.nextInt();
                        b=scan.nextInt();
                        c=scan.nextInt();
                        T=scan.nextInt();
                        for(int i=0;i<a;i++)
                            for(int j=0;j<b;j++)
                                for(int k=0;k<c;k++){
                                      map[i][j][k]=scan.nextInt();
                                      vis[i][j][k]=false;
                                }
                        out.println(bfs());
                }
                out.flush();
        }
}
相關文章
相關標籤/搜索