Go: package main

import (
	"bufio"
	"os"
	"strings"
	"strconv"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)

var (
	dx = []int{0, -1, 0, 1}
	dy = []int{1, 0, -1, 0}
)

func main() {
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		w, _ := strconv.Atoi(buf[0])
		h, _ := strconv.Atoi(buf[1])
		if w == 0 && h == 0 {
			break
		}
		scanner.Scan()
		buf_ := strings.Split(scanner.Text(), " ")
		xs, _ := strconv.Atoi(buf_[0])
		ys, _ := strconv.Atoi(buf_[1])
		scanner.Scan()
		buf__ := strings.Split(scanner.Text(), " ")
		xg, _ := strconv.Atoi(buf__[0])
		yg, _ := strconv.Atoi(buf__[1])
		xs--
		ys--
		xg--
		yg--
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		field := make([][]int, 100)
		for i := range  field {
			field[i] = make([]int, 100)
		}
		visited := make([][]bool, 100)
		for i := range visited {
			visited[i] = make([]bool, 100)
		}
		for i := 0; i < n; i++ {
			scanner.Scan()
			buf___ := strings.Split(scanner.Text(), " ")
			c, _ := strconv.Atoi(buf___[0])
			d, _ := strconv.Atoi(buf___[1])
			x, _ := strconv.Atoi(buf___[2])
			y, _ := strconv.Atoi(buf___[3])
			x--
			y--
			switch d {
			case 0:
				for j := 0; j < 4; j++ {
					for k := 0; k < 2; k++ {
						field[x+j][y+k] = c
					}
				}
			case 1:
				for j := 0; j < 2; j++ {
					for k := 0; k < 4; k++ {
						field[x+j][y+k] = c
					}
				}
			}
		}
		if field[xs][ys] != field[xg][yg] || // スタートとゴールの色が等しくないと"NG"
			field[xs][ys] == 0 { // スタートの色が無職
			fmt.Println("NG")
			continue
		}
		Q := make([]Entry, 0)
		visited[xs][ys] = true
		Q = append(Q, Entry{xs, ys})
		for len(Q) > 0 {
			row := Q[0].x
			col := Q[0].y
			Q = Q[1:]
			for i := 0; i < 4; i++ {
				if 0 <= row+dx[i] && row+dx[i] < w &&
					0 <= col+dy[i] && col+dy[i] < h && // 移動可能な範囲内かどうか
					!visited[row + dx[i]][col + dy[i]] && // 訪問済みか
					field[row+dx[i]][col+dy[i]]==field[row][col] { // 色が同じかどうか
						visited[row+dx[i]][col+dy[i]] = true
						Q = append(Q, Entry{row+dx[i],col+dy[i]})
				}
			}
		}
		if visited[xg][yg] {
			fmt.Println("OK")
		} else {
			fmt.Println("NG")
		}
	}
}

type Entry struct {
	x, y int
}

C++: #include <iostream>
using namespace std;
 
int F[105][105];
int xg,yg;
 
 
void DFS(int Y,int X,int c){
  if(F[Y][X] != c){
    return;
  }
 
  F[Y][X] = -1;
  DFS(Y-1,X  ,c);
  DFS(Y  ,X+1,c);
  DFS(Y+1,X  ,c);
  DFS(Y  ,X-1,c);
}
 
 
int main(){
  int w,h,xs,ys,n;
  while(1){
    cin >> w >> h;
    if(w == 0 && h == 0)
      break;
for(int i=0; i<105; i++){
      for(int j=0; j<105; j++){
        F[i][j]=0;
      }
    }
     
    cin >> xs >> ys >> xg >> yg >> n;
 
 
    for(int i=0;i<n;i++){
      int c,d,x,y;
      cin >> c >> d >> x >> y;
      if(d == 0){
        for(int j=0;j<4;j++){
          F[x+j][y] = c;
          F[x+j][y+1] = c;
        }
      } else {
        for(int j=0;j<4;j++){
          F[x][y+j] = c;
          F[x+1][y+j] = c;
        }
      }
    }

  DFS(xs,ys,F[xs][ys]);
 
  if(F[xg][yg] == -1){
    cout << "OK" << endl;
  } else {
    cout << "NG" <<endl;
  }
  }
}

C++: #include <iostream>
using namespace std;

int F[102][102];
int xg,yg,ok;

void Maze(int X,int Y,int C){
	//cout << X<<Y<<F[X][Y]<<endl;
	if(F[X][Y]!=C)
		return;

	

	if(X==xg&&Y==yg){
		cout << "OK"<<endl;
		ok++;
	}

	F[X][Y]='.';

	Maze(X-1,Y  ,C);
	Maze(X  ,Y+1,C);
	Maze(X+1,Y  ,C);
	Maze(X  ,Y-1,C);
	
}



int main(){	
	while(1){
		ok=0;

		int w,h,xs,ys,n,c,d,x,y;

		cin >>w>>h;
		if(w==0&&h==0)
			return 0;

		cin >>xs>>ys;
		cin >>xg>>yg;
		cin >>n;


		for(int i=1; i<=w; i++)
			for(int j=1; j<=h; j++)
				F[j][i]=0;


		//for(int i=0; i<=101;i++){
			//F[0][i]=6;
			//F[i][0]=6;
		//}

		for(int i=1; i<=w;i++){
				F[w+1][i]=6;
				F[0][i]=6;
		}
		for(int i=1; i<=h;i++){
				F[i][h+1]=6;
				F[i][0]=6;
		}

		int N=0;
		while(N<n){
//cout <<N;
			cin >>c>>d>>x>>y;
//cout<<c<<d<<x<<y<<endl;
			if(d){
				for(int i=x; i<x+2; i++)
					for(int j=y; j<y+4; j++){
						F[i][j]=c;
//cout <<F[i][j];
				}
//cout <<endl;
			}else{
				for(int i=x; i<x+4; i++)
					for(int j=y; j<y+2; j++){
						F[i][j]=c;
//cout <<F[i][j];
					}
//cout <<endl;
			}
			N++;
		}

for(int i=0; i<=101; i++){
	for(int j=0; j<=101; j++){
		cout <<F[j][i];
		}
	cout << endl;
}
		
		Maze(xs,ys,F[xs][ys]);

		if(ok==0)
			cout <<"NG"<<endl;

	}

}

C++: #include<iostream>
#include<cstdio>
using namespace std;
int w,h,xs,ys,xg,yg,n;
int c,d,x,y,ans=0,f=0;
int map[101][101]={0},v[101][101]={0};
int root(int x,int y,int vmap[][101]){
	int mx[]={0,1,0,-1},fx;
	int my[]={1,0,-1,0},fy;
	if(x==xg&&y==yg){
		f=1;
		return f;
	}
	for(int i=0;i<4;i++){
		fx=x+mx[i];
		fy=y+my[i];
		if(map[fy][fx]==map[ys][xs]&&fy>0&&fy<=h&&fx>0&&fx<=w&&vmap[fy][fx]==0){
			vmap[y][x]=1;
			return root(fx,fy,vmap);
		}
	}
	return f;
}
int main(){
	scanf("%d %d",&w ,&h);
	while(w!=0&&h!=0){
		scanf("%d %d %d %d %d",&xs ,&ys ,&xg ,&yg ,&n);
		for(int i=0;i<n;i++){
			scanf("%d %d %d %d",&c ,&d ,&x ,&y);
			if(d==0){
				for(int i=x;i<x+4;i++){
					for(int e=y;e<y+2;e++){
						map[e][i]=c;
					}
				}
			}
			if(d==1){
				for(int i=x;i<x+2;i++){
					for(int e=y;e<y+4;e++){
						map[e][i]=c;
					}
				}
			}
		}
		/*for(int i=0;i<w;i++){
			for(int i1=0;i1<h;i1++){
				printf("%d ",map[i][i1]);
			}printf("\n");
		}*/
		x=xs;
		y=ys;
		ans=root(x,y,v);
		if(ans==1){
			printf("OK\n");
		}
		else{
			printf("NG\n");
		}
		for(int i=0;i<101;i++){
			for(int i1=0;i1<101;i1++){
				map[i][i1]=0;
				v[i][i1]=0;
			}
		}
		f=0;
		ans=0;
		scanf("%d %d",&w ,&h);
	}
	return 0;
}

C++: #include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int w,h;
int xs,ys;
int xg,yg;
int n;
int map[101][101];
bool ch;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};

void dfs(int x,int y,int c){
	if(x==xg && y==yg)ch=true;
	else if(ch==false){
		map[x][y]=-1;
		for(int i=0;i<4;i++){
			int cx=x+dx[i],cy=y+dy[i];
			if(cx>=1 && cx<=w && cy>=1 && cy<=h  && map[cx][cy]==c)dfs(cx,cy,c);
		}
	}
}

int main(void){
	while(1){
		ch=false;
		memset(map,0,sizeof(map));
		cin >> w >> h;
		if(w==0 && h==0)break;
		cin >> xs >> ys;
		cin >> xg >> yg;
		cin >> n;
		for(int i=0;i<n;i++){
			int c,d,x,y;
			cin >> c >> d >> x >> y;
			if(d==0){
				for(int i=y;i<y+2;i++){
					for(int j=x;j<x+4;j++){
						map[j][i]=c;
					}
				}
			}
			if(d==1){
				for(int i=y;i<y+4;i++){
					for(int j=x;j<x+2;j++){
						map[j][i]=c;
					}
				}
			}
		}
		if(map[xs][ys]>=1)dfs(xs,ys,map[xs][ys]);
		if(ch)cout << "OK" << endl;
		else cout << "NG" << endl;
	}
    return 0;
}

C++: #include <iostream>
using namespace std;

int C[102][102];

void meiro(int W,int H,int c){
  if(C[W][H]!=c){
    return;
  }

  C[W][H] = -1;

  meiro(W-1,H  ,c);
  meiro(W  ,H+1,c);
  meiro(W+1,H  ,c);
  meiro(W  ,H-1,c);
}

int main(){
  while(1){
    int w,h;
    cin >> w >> h;
    if(w==0 && h==0){
      break;
    }

    for(int i=0;i<102;i++){
      for(int j=0;j<102;j++){
        C[i][j] = 0;
      }
    }

    int xs,ys,xg,yg;
    cin >> xs >> ys >> xg >> yg;

    int n;
    cin >> n;

    int c,d,x,y;
    for(int i=0;i<n;i++){
      cin >> c >> d >> x >> y;

      if(d==0){
        for(int j=x;j<x+4;j++){
          for(int k=y;k<y+2;k++){
            C[j][k]=c;
          }
        }
      }else{
        for(int j=x;j<x+2;j++){
          for(int k=y;k<y+4;k++){
            C[j][k]=c;
          }
        }
      }
    }
    if(C[xs][ys] == 0){
      cout << "NG" << endl;
      continue;
    }
    
    meiro(xs,ys,C[xs][ys]);

    if(C[xg][yg] == -1){
      cout << "OK" << endl;
    }else{
      cout << "NG" << endl;
    }
  }

  return 0;
}