Hi guys, I wrote a straight forward BFS solution to solve 1B Expogo 
question, targeting to solve test set 1 and 2.
However, not knowing which corner case it fails, the solution got WA.
Basic cases are all past locally, anyone could advise why below solution 
fails?

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Solution {

    private static final int LIMIT = 400; // target at set 2: limit 100, 
loosen a bit
    private static final int[][] dirs = {{0,1},{0,-1},{1,0},{-1,0}};
    private static final String[] ways = {"N", "S", "E", "W"};

    private static String solve(int x, int y) {
        int maxStep = (int) (Math.log(LIMIT) / Math.log(2) + 1);
        Queue<int[]> queue = new LinkedList<>();
        boolean[][] visited = new boolean[2*LIMIT+1][2*LIMIT+1];
        String[][] paths = new String[2*LIMIT+1][2*LIMIT+1];
        for (String[] path : paths) Arrays.fill(path, "");
        queue.offer(new int[]{0, 0});
        //visited[LIMIT][LIMIT] = true; // let (0, 0) output IMPOSSIBLE
        int step = 0, dist;
        while (!queue.isEmpty() && step <= maxStep + 3) { // loosen a bit
            int size = queue.size();
            dist = (int) Math.pow(2, step);
            for (int s = 0; s < size; s++) {
                int[] cell = queue.poll();
                if (step > 0 && cell[0] == x && cell[1] == y) return 
paths[x+LIMIT][y+LIMIT]; // let (0, 0) output IMPOSSIBLE
                for (int i = 0; i < 4; i++) {
                    int xx = cell[0] + dirs[i][0] * dist;
                    int yy = cell[1] + dirs[i][1] * dist;
                    if (xx >= -LIMIT && xx <= LIMIT && yy >= -LIMIT && yy 
<= LIMIT && !visited[xx+LIMIT][yy+LIMIT]) {
                        visited[xx+LIMIT][yy+LIMIT] = true;
                        queue.offer(new int[]{xx, yy});
                        paths[xx+LIMIT][yy+LIMIT] = 
paths[cell[0]+LIMIT][cell[1]+LIMIT] + ways[i];
                    }
                }
            }
            step++;
        }
        return "IMPOSSIBLE";
    }

    public static void main(String[] args) {
        Scanner in = new Scanner((System.in));
        int T = in.nextInt(); // Scanner has functions to read ints, longs, 
strings, chars, etc.
        for (int ks = 1; ks <= T; ++ks) {
            int x = in.nextInt();
            int y = in.nextInt();
            System.out.println("Case #" + ks + ": " + solve(x, y));
        }
    }
}



-- 
You received this message because you are subscribed to the Google Groups 
"Google Code Jam" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-code+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-code/b4688fc7-0a3f-4b64-b401-02b520093d6c%40googlegroups.com.

Reply via email to