and I see other people's source and finally i rewrite and sovle this problem using Queue
my code is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | package srm646; import java.util.LinkedList; import java.util.Queue; public class TheGridDivTwo { public static void main(String[] args) { int [] x = {5, 1, -1, 4, 1, 3, 5, 2, 1, -1, 4, 2, -1, -1, 0, -2, 3, 3, 1, 2, 4, 4, 1, 2, 3, 2, 3, 5, -1, 0, 1, 5, 4, -2, 5, 0, 0, 4, -2, 0, 3}; int [] y = {3, 4, 2, 1, -2, 4, -2, 0, 1, -1, 0, 2, 5, 1, 3, 4, -2, 1, 2, 5, 2, -2, 5, -2, 3, 3, 5, 5, 0, 4, 0, 1, 4, 0, 4, -2, 2, -1, -2, 1, 0}; int k = 11; TheGridDivTwo two = new TheGridDivTwo(); System.out.println(two.find(x, y, k)); } public int find(int[] x, int[] y, int k){ Queue<Point> queue= new LinkedList<Point>(); int[][] visited = new int[2001][2001]; for(int i=0;i<x.length; i++){ visited[x[i]+1000][y[i]+1000] = 1; } if(x.length == 0){ return k; } Point start = new Point(0, 0, k); visited[1000][1000] = 1; queue.add(start); int maxX = 0; while(!queue.isEmpty()){ Point point = queue.poll(); if(point.sec <= 0){ continue; } Point right = new Point(point.x + 1, point.y, point.sec-1); Point top = new Point(point.x , point.y + 1, point.sec-1); Point bottm = new Point(point.x , point.y - 1, point.sec-1); Point left = new Point(point.x - 1, point.y, point.sec-1); // right if(!isVisited(right, visited) ){ queue.add(right); maxX = Math.max(maxX, point.x +1); } // top if(!isVisited(top, visited) ) queue.add(top); // bottom if(!isVisited(bottm, visited)) queue.add(bottm); // left if(!isVisited(left ,visited)) queue.add(left); } return maxX; } public boolean isVisited(Point point, int[][] visited){ int x = point.x; int y = point.y; int sec = point.sec; if((sec + x < 0) || visited[x+ 1000][y+1000] == 1){ return true; } visited[x+ 1000][y+1000] = 1; return false; } class Point{ private int x; private int sec; private int y; public Point(int x, int y, int sec) { this.x = x; this.y = y; this.sec = sec; } } } |
No comments:
Post a Comment