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>
#include<cstdio>
using namespace std;
int w,h,xs,ys,xg,yg,n;
int c,d,x,y,ans=0,f=0;
int map[100][100]={0},v[100][100]={0};
int root(int x,int y,int vmap[][100]){
	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[xs][ys]&&fy>=0&&fy<h&&fx>=0&&fx<w&&vmap[fy][fx]==0){
			vmap[fy][fx]=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 w=x;w<x+4;w++){
					for(int h=y;h<y+2;h++){
						map[h][w]=c;
					}
				}
			}
			if(d==1){
				for(int w=x;w<x+2;w++){
					for(int h=y;h<y+4;h++){
						map[h][w]=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<100;i++){
			for(int i1=0;i1<100;i1++){
				map[i][i1]=0;
				v[i][i1]=0;
			}
		}
		f=0;
		ans=0;
		scanf("%d %d",&w ,&h);
	}
	return 0;
}

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

int F[102][102];


int DFS(int Y,int X,int c){
  int cnt = 0;
  if(F[Y][X] != c){
    return 0;
  }

  F[Y][X] = -1;
  cnt += DFS(Y-1,X  ,c);
  cnt += DFS(Y  ,X+1,c);
  cnt += DFS(Y+1,X  ,c);
  cnt += DFS(Y  ,X-1,c);
  return cnt;
}


int main(){
  int w,h,xs,ys,xg,yg,n;
  while(1){
    cin >> w >> h;
    if(w == 0 && h == 0)
      break;

      for(int i=0;i<102;i++){
        for(int j=0;j<102;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(xs == 8){
    cout << "OK" << endl;
  } else {
    cout << "NG" << endl;
  }
  }
}

C++: #include <vector>
#include <iostream>

enum class Color {
	goal, white, yellow, green, blue, red, null
};
void recursive(std::vector<std::vector<Color>> &vector, const int &x, const int &y, const Color c) {
	if (0 <= x && x < vector.at(0).size() && 0 <= y && y < vector.size() && vector.at(y).at(x) == c) {
		vector.at(y).at(x) = Color::goal;
		recursive(vector, x, y - 1, c); recursive(vector, x + 1, y, c); recursive(vector, x, y + 1, c); recursive(vector, x - 1, y, c);
	}
}
void fill(std::vector<std::vector<Color>> &vector, const int &x, const int &y, const Color &c) {
	for (auto i = 0; i < 2; ++i) {
		for (auto j = 0; j < 2; ++j) {
			vector.at(y + i).at(x + j) = c;
		}
	}
}
int main() {
	int w, h;
	std::cin >> w >> h;
	while (w != 0) {
		std::vector<std::vector<Color>> vector(h, std::vector<Color>(w, Color::null));
		int start_x, start_y;
		std::cin >> start_x >> start_y;
		int goal_x, goal_y;
		std::cin >> goal_x >> goal_y;
		int n;
		std::cin >> n;
		for (auto i = 0; i < n; ++i) {
			int c, d, x, y;
			std::cin >> c >> d >> x >> y;
			fill(vector, x - 1, y - 1, Color(c));
			fill(vector, x + 1 - 2 * d, y - 1 + 2 * d, Color(c));
		}
		recursive(vector, start_x - 1, start_y - 1, vector.at(start_y).at(start_x));
		if (vector.at(goal_y - 1).at(goal_x - 1) == Color::goal) {
			std::cout << "OK\n";
		}
		else {
			std::cout << "NG\n";
		}
		std::cin >> w >> h;
	}
	return 0;
}

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<1; i++){
      for(int j=0; j<1; 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;
        }
      }
    }
if(F[xs][ys]==0){
      cout << "NG" << endl;
      continue;
    }
  DFS(xs,ys,F[xs][ys]);
 
  if(F[xg][yg] == -1){
    cout << "OK" << endl;
  } else {
    cout << "NG" <<endl;
  }
  }
}

C++: include<iostream>
using namespace std;
#define MAX_H 100
#define MAX_W 100
#define INF 1000;
int h,w;
int field[MAX_H][MAX_W];
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
void dfs(int y,int x,const int sc){
	if(y<=0 || x<=0 || y>h || x>w)return;
	if(field[y][x]==sc){
		field[y][x]=0;
		for(int i=0;i<4;i++)dfs(y+dy[i],x+dx[i],sc);
	}
	return;
}
int main(){
	int sx,sy,gx,gy,n;
	while(cin>>w>>h){
        if(!w && !h)break;
		cin>>sx>>sy>>gx>>gy>>n;
		for(int i=0;i<MAX_H;i++){
			for(int j=0;j<MAX_W;j++){
					field[i][j]=INF;
				}
		}
		while(n--){
			int c,d,x,y;
			cin>>c>>d>>x>>y;
			for(int i=0;i<2;i++){
				for(int j=0;j<4;j++){
					if(d)field[y+j][x+i]=c;
					else field[y+i][x+j]=c;	
				}	
			}	
		}
		dfs(sy,sx,field[sy][sx]);		
		if(field[gy][gx])cout<<"NG"<<endl;
		else cout<<"OK"<<endl;
		
	}
	return 0;
}