Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.64 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.LinkedList;
  3. import java.util.Queue;
  4. import java.util.Scanner;
  5.  
  6.  
  7. public class Main {
  8.     public static void main(String[] args) {
  9.         Scanner scn = new Scanner(System.in);
  10.        
  11.         int T = scn.nextInt();
  12.        
  13.         for(int t = 1; t <= T; t++){
  14.             int r = scn.nextInt();
  15.             int c = scn.nextInt();
  16.            
  17.             char[][] a = new char[r][c];
  18.            
  19.             for(int i = 0; i < r; i++)
  20.                 a[i] = scn.next().toCharArray();
  21.            
  22. //          for(char[] i: a)
  23. //              System.out.println(new String(i));
  24.            
  25.             int si = 0, sj = 0;
  26.             int ei = 0, ej = 0;
  27.             ML:for(int i = 0 ;i < r; i++)
  28.                 for(int j = 0; j < c; j++)
  29.                     if(a[i][j] == 'O'){
  30.                         a[i][j] = '.';
  31.                         si = i; sj = j;
  32.                         break ML;
  33.                     }
  34.            
  35.             ML:for(int i = 0; i < r; i++){
  36.                 for(int j = 0; j < c; j++){
  37.                     if(a[i][j] == 'X'){
  38.                         a[i][j] = '.';
  39.                         ei = i; ej = j;
  40.                         break ML;
  41.                     }
  42.                 }
  43.             }
  44.             int min = bfs(a, si, sj, ei, ej, r, c);
  45.            
  46.             if(min == Integer.MAX_VALUE)System.out.printf("Case #%d: THE CAKE IS A LIE\n", t);
  47.             else System.out.printf("Case #%d: %d\n", t, min);
  48.         }
  49.     }
  50.  
  51.     private static int bfs(char[][] a, int si, int sj, int ei, int ej, int r, int c) {
  52.         boolean[][] v = new boolean[r][c];
  53.         Queue<State> q = new LinkedList<State>();
  54.         ArrayList<Cell> blue_portals = new ArrayList<Cell>();
  55.        
  56.         generate(si, sj, blue_portals, a, r, c);
  57.         q.add(new State(si, sj, a, 0, blue_portals));
  58.         v[si][sj] = true;
  59.        
  60.         while(!q.isEmpty()){
  61.             State st = q.poll();
  62.            
  63. //          for(int l = 0; l < st.c; l++)
  64. //              System.out.print("\t");
  65. //          System.out.println(st.i+", "+st.j);
  66.            
  67.             if(st.i == ei && st.j == ej)
  68.                 return st.c;
  69.            
  70.             for(int k = 0; k < 4; k++){
  71.                 int ii = st.i + di[k];
  72.                 int jj = st.j + dj[k];
  73.                
  74.                 if(ii < 0 || ii >= r || jj < 0 || jj >= c || a[ii][jj] == '#'){//#
  75.                     for(int itr = 0; itr < st.b.size(); itr++){
  76.                         ArrayList<Cell> nb = new ArrayList<Cell>();
  77.                         nb.add(new Cell(st.i, st.j));
  78.                        
  79.                         int iii = st.b.get(itr).i;
  80.                         int jjj = st.b.get(itr).j;
  81.                        
  82.                         if(v[iii][jjj])continue;
  83.                        
  84.                         v[iii][jjj] = true;
  85.                        
  86.                         generate(iii, jjj, nb, a, r, c);
  87.                        
  88.                         q.add(new State(iii, jjj, a, st.c+1, nb));
  89.                     }
  90.                 }else if(a[ii][jj] == 'O'){
  91.                     if(v[ii][jj])continue;
  92.                    
  93.                     v[ii][jj] = true;
  94.                    
  95.                     a[ii][jj] = '.';
  96.                     generate(ii, jj, st.b, a, r, c);
  97.                     q.add(new State(ii, jj, a, st.c+1, st.b));
  98.                 }else{//.
  99.                     if(v[ii][jj])continue;
  100.                    
  101.                     v[ii][jj] = true;
  102.                    
  103.                     ArrayList<Cell> nb = (ArrayList<Cell>) st.b.clone();
  104.                     generate(ii, jj, nb, a, r, c);
  105.                     q.add(new State(ii, jj, a, st.c+1, nb));
  106.                 }
  107.             }
  108.         }
  109.        
  110.         return Integer.MAX_VALUE;
  111.     }
  112.  
  113.     private static boolean done(char[][] a, int r, int c) {
  114.         for(int i = 0; i < r; i++)
  115.             for(int j = 0; j < c; j++)
  116.                 if(a[i][j] == 'X')return false;
  117.         return true;
  118.     }
  119.  
  120.     static int[] di = {0, 0, 1, -1};
  121.     static int[] dj = {1, -1, 0, 0};
  122.     private static void generate(int i, int j, ArrayList<Cell> b, char[][] a, int r, int c) {
  123.         ML:for(int d = 0; d < 4; d++){
  124.             for(int m = 0; m < 20; m++){
  125.                 int ii = i + m*di[d];
  126.                 int jj = j + m*dj[d];
  127.                
  128.                 if(ii < 0 || ii >= r || jj < 0 || jj >= c || a[ii][jj] == '#'){
  129.                     b.add(new Cell(ii - di[d], jj - dj[d]));
  130.                     continue ML;
  131.                 }
  132.             }
  133.         }      
  134.     }
  135. }
  136. class State{
  137.     int i, j;
  138.     char[][] a;
  139.     ArrayList<Cell> b;
  140.     int c;
  141.     public State(int ii, int ji, char[][] ai, int ci, ArrayList<Cell> bi){
  142.         i = ii;
  143.         j = ji;
  144.         a = ai;
  145.         c = ci;
  146.         b = bi;
  147.     }
  148. }
  149.  
  150. class Cell{
  151.     int i, j;
  152.     public Cell(int ii, int ji){
  153.         i = ii;
  154.         j = ji;
  155.     }
  156.     public String toString(){
  157.         return i+","+j;
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement