Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.Scanner;
- public class Main {
- public static void main(String[] args) {
- Scanner scn = new Scanner(System.in);
- int T = scn.nextInt();
- for(int t = 1; t <= T; t++){
- int r = scn.nextInt();
- int c = scn.nextInt();
- char[][] a = new char[r][c];
- for(int i = 0; i < r; i++)
- a[i] = scn.next().toCharArray();
- // for(char[] i: a)
- // System.out.println(new String(i));
- int si = 0, sj = 0;
- int ei = 0, ej = 0;
- ML:for(int i = 0 ;i < r; i++)
- for(int j = 0; j < c; j++)
- if(a[i][j] == 'O'){
- a[i][j] = '.';
- si = i; sj = j;
- break ML;
- }
- ML:for(int i = 0; i < r; i++){
- for(int j = 0; j < c; j++){
- if(a[i][j] == 'X'){
- a[i][j] = '.';
- ei = i; ej = j;
- break ML;
- }
- }
- }
- int min = bfs(a, si, sj, ei, ej, r, c);
- if(min == Integer.MAX_VALUE)System.out.printf("Case #%d: THE CAKE IS A LIE\n", t);
- else System.out.printf("Case #%d: %d\n", t, min);
- }
- }
- private static int bfs(char[][] a, int si, int sj, int ei, int ej, int r, int c) {
- boolean[][] v = new boolean[r][c];
- Queue<State> q = new LinkedList<State>();
- ArrayList<Cell> blue_portals = new ArrayList<Cell>();
- generate(si, sj, blue_portals, a, r, c);
- q.add(new State(si, sj, a, 0, blue_portals));
- v[si][sj] = true;
- while(!q.isEmpty()){
- State st = q.poll();
- // for(int l = 0; l < st.c; l++)
- // System.out.print("\t");
- // System.out.println(st.i+", "+st.j);
- if(st.i == ei && st.j == ej)
- return st.c;
- for(int k = 0; k < 4; k++){
- int ii = st.i + di[k];
- int jj = st.j + dj[k];
- if(ii < 0 || ii >= r || jj < 0 || jj >= c || a[ii][jj] == '#'){//#
- for(int itr = 0; itr < st.b.size(); itr++){
- ArrayList<Cell> nb = new ArrayList<Cell>();
- nb.add(new Cell(st.i, st.j));
- int iii = st.b.get(itr).i;
- int jjj = st.b.get(itr).j;
- if(v[iii][jjj])continue;
- v[iii][jjj] = true;
- generate(iii, jjj, nb, a, r, c);
- q.add(new State(iii, jjj, a, st.c+1, nb));
- }
- }else if(a[ii][jj] == 'O'){
- if(v[ii][jj])continue;
- v[ii][jj] = true;
- a[ii][jj] = '.';
- generate(ii, jj, st.b, a, r, c);
- q.add(new State(ii, jj, a, st.c+1, st.b));
- }else{//.
- if(v[ii][jj])continue;
- v[ii][jj] = true;
- ArrayList<Cell> nb = (ArrayList<Cell>) st.b.clone();
- generate(ii, jj, nb, a, r, c);
- q.add(new State(ii, jj, a, st.c+1, nb));
- }
- }
- }
- return Integer.MAX_VALUE;
- }
- private static boolean done(char[][] a, int r, int c) {
- for(int i = 0; i < r; i++)
- for(int j = 0; j < c; j++)
- if(a[i][j] == 'X')return false;
- return true;
- }
- static int[] di = {0, 0, 1, -1};
- static int[] dj = {1, -1, 0, 0};
- private static void generate(int i, int j, ArrayList<Cell> b, char[][] a, int r, int c) {
- ML:for(int d = 0; d < 4; d++){
- for(int m = 0; m < 20; m++){
- int ii = i + m*di[d];
- int jj = j + m*dj[d];
- if(ii < 0 || ii >= r || jj < 0 || jj >= c || a[ii][jj] == '#'){
- b.add(new Cell(ii - di[d], jj - dj[d]));
- continue ML;
- }
- }
- }
- }
- }
- class State{
- int i, j;
- char[][] a;
- ArrayList<Cell> b;
- int c;
- public State(int ii, int ji, char[][] ai, int ci, ArrayList<Cell> bi){
- i = ii;
- j = ji;
- a = ai;
- c = ci;
- b = bi;
- }
- }
- class Cell{
- int i, j;
- public Cell(int ii, int ji){
- i = ii;
- j = ji;
- }
- public String toString(){
- return i+","+j;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement