■0207 Block
(xs,ys)から同じ色を持つブロックについてBFS.(xg,yg)が訪問済みであればOK.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int w, h; int sx, sy; int gx, gy; int[][] a; void run(){ for(;;){ w=sc.nextInt(); h=sc.nextInt(); if((w|h)==0){ break; } sx=sc.nextInt()-1; sy=sc.nextInt()-1; gx=sc.nextInt()-1; gy=sc.nextInt()-1; int n=sc.nextInt(); a=new int[h][w]; for(int k=0; k<n; k++){ int c=sc.nextInt(); int d=sc.nextInt(); int x=sc.nextInt()-1; int y=sc.nextInt()-1; for(int j=0; j<2; j++){ for(int i=0; i<4; i++){ if(d==0){ a[y+j][x+i]=c; }else{ a[y+i][x+j]=c; } } } } solve(); } } void solve(){ LinkedList<P> que=new LinkedList<P>(); boolean[][] visited=new boolean[h][w]; int[] dx={0, 0, -1, 1}; int[] dy={-1, 1, 0, 0}; que.offer(new P(sx, sy)); visited[sy][sx]=true; for(; !que.isEmpty();){ P p=que.poll(); for(int i=0; i<4; i++){ P q=new P(p.x+dx[i], p.y+dy[i]); if(q.x>=0&&q.x<w&&q.y>=0&&q.y<h&&a[q.y][q.x]==a[sy][sx] &&!visited[q.y][q.x]){ que.offer(q); visited[q.y][q.x]=true; } } } println(visited[gy][gx]?"OK":"NG"); } class P{ int x, y; P(int x, int y){ this.x=x; this.y=y; } } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
0 件のコメント:
コメントを投稿