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 <stdio.h>
#include <queue>
using namespace std;
class node{
public:
	int x,y;
	void set(int xx,int yy){
		x = xx;
		y = yy;
	}
	bool check(int w,int h){
		if(x>=0&&y>=0){
			if(x<=w&&y<=h) return true;
		}
		return false;
	}
	
};

int main(){
	int i,j;
	while(1){
		int w,h;
		int xs,ys,xg,yg,n,c,dir,x,y;
		int color[101][101];
		int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
		bool visited[101][101];
		queue<node> q;
		node a;
		scanf("%d%d",&w,&h);
		if(w==0&&h==0) break;
		scanf("%d%d",&xs,&ys);
		scanf("%d%d",&xg,&yg);
		scanf("%d",&n);
	
		while(n--){
			scanf("%d%d%d%d",&c,&dir,&x,&y);
			if(dir==0){
				for(i=0;i<2;i++){
					for(j=0;j<4;j++) color[x+j][y+i] = c;
				}
			}
			else{
				for(i=0;i<2;i++){
					for(j=0;j<4;j++) color[x+i][y+j] = c;
				}
			}
		}
		a.set(xs,ys);
		q.push(a);
		visited[a.x][a.y]=true;
		while(!q.empty()){
			a = q.front();
			q.pop();
			for(i=0;i<4;i++){
				a.x += dx[i];
				a.y += dy[i];
				if(!a.check(w,h)&&(color[xs][ys]==color[a.x][a.y])&&!visited[a.x][a.y]){
					q.push(a);
					visited[a.x][a.y] = true;
					if(a.x==xg&&a.y==yg) break;
				}
			}
		}
		if(visited[xg][yg]) printf("OK\n");
		else printf("NG\n");
		for(i=0;i<101;i++){
			for(j=0;j<101;j++) visited[i][j] = false;
		}
	}

	return 0;
}

C++: #include<iostream>
using namespace std;
int w,h,xs,ys,xg,yg,n;
int map[101][101];
string ans;
char start;
void fun(int y,int x){
    if(map[y][x]==start){
    	cout << 1 << endl;
        map[y][x]=7;
    }
    else
        return;
    if(x<1||w<x||y<1||h<y)
        return;
    if(map[y][x]==map[yg][xg]){
        ans="OK";
        return;
    }
    fun(y,x+1);
    fun(y,x-1);
    fun(y+1,x);
    fun(y-1,x);
}
void mc(){
    int c,d,x,y;
    for(int i=0;i<n;i++){
        cin >> c >> d >> x >> y;
        if(d==0){
            for(int j=0;j<2;j++){
                for(int k=0;k<4;k++){
                    map[y+j][x+k]=c;
                }
            }
        }
        else{
            for(int j=0;j<4;j++){
                for(int k=0;k<2;k++){
                    map[y+j][x+k]=c;
                }
            }
        }
    }
}
int main(){
    while(cin >> w >> h,w){
    	ans="NG";
        cin >> xs >> ys >> xg >> yg >> n;
        for(int i=1;i<=h;i++){
            for(int j=1;j<=w;j++){
                map[i][j]=0;
            }
        }
        mc();
        start=map[ys][xs];
        if(map[ys][xs]==0||map[yg][xg]==0);
        else
        	fun(ys,xs);
        for(int i=1;i<w;i++){
        	for(int j=1;j<h;j++){
        		cout << map[i][j];
        	}
        	cout << endl;
        }
        cout << ans << endl;
    }
}

C++: #include<stdio.h>
int w,h;
int is(int x,int y){
	return (x>=0 && x < w && y>=0 && y< h)?1:0;
}
int main(void){
	const int dx[4]={0,-1,0,1};
	const int dy[4]={-1,0,1,0};
	int qx[100000];
	int qy[100000];
	int p,mx;
    int n,m[101][101]={0};
    int xs,ys,xg,yg,a,c,d,x,y,cnt,f;
	for(;;){
		scanf("%d %d",&w,&h);
		//printf("%d %d\n",w,h);
		if(w==0)break;
		for(int i=0;i<w;i++){
			for(int j=0;j<h;j++){
				m[i][j]=0;
			}
		}
		scanf("%d %d %d %d",&xs,&ys,&xg,&yg);
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d %d %d %d",&c,&d,&x,&y);
			for(int j=0;j<(d==0?2:4);j++){
				for(int k=0;k<(d==0?4:2);k++){
					m[x-1+k][y-1+j]=c;
				}
			}
		}
		c = m[xs-1][ys-1];
/**		if(c==0){
			puts("NG");
			continue;
		}//**/
		p=0;
		mx=1;
		qx[0]=xs-1;
		qy[0]=ys-1;
		m[xs-1][ys-1]=-1;
		f=1;
/**
		for(int i=0;i<h;i++){
			for(int j=0;j<w;j++){
				printf("%3d",m[j][i]);
			}
			puts("");
		}
				printf("%d\n",c);
				/**/
		while(f==1 && p<mx){
			cnt = 0;
			for(int i=0;i<4;i++){
				x = qx[p] + dx[i];
				y = qy[p] + dy[i];
				if(is(x,y)==1 && m[x][y] == c){
					m[x][y]=-1;
					qx[mx+cnt] = x;
					qy[mx+cnt] = y;
					cnt++;
					if(x == xg-1 && y == yg-1)f=0;
					//printf("%d %d にいるよ,%d\n",x+1,y+1,i);
				}
			}
			mx += cnt;
			p++;
		}/**
		for(int i=0;i<h;i++){
			for(int j=0;j<w;j++){
				printf("%3d",m[j][i]);
			}
			puts("");
		}
				printf("%d\n",c);
				/**/

		puts(f?"NG":"OK");
	}
    return 0;
}

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

int w,h,sx,sy,gx,gy;
int mas[101][101],used[101][101];
int dx[] = {0,1,0,-1},dy[] = {1,0,-1,0};

void make_map(int x,int y,int chk,int color){
  if(chk == 0){
    for(int i=y;i<y+2;i++){
      for(int j=x;j<x+4;j++) mas[i][j] = color;
    }
  }
  else {
    for(int i=y;i<y+4;i++){
      for(int j=x;j<x+2;j++) mas[i][j] = color;
    }
  }
}

bool dfs(int x,int y){
  used[y][x] = true;
  if(x == gx && y == gy) return true;
  for(int i=0;i<4;i++){
    int nx = x + dx[i];
    int ny = y + dy[i];
    if(nx >= 0 && nx < w && ny >= 0 && ny < h && mas[ny][nx] == mas[sy][sx] && !used[ny][nx]) dfs(nx,ny);
  }
  return used[gy][gx];
}

int main(){
  int n;
  while(cin >> w >> h,w||h){
    fill_n(mas[0],101*101,0);
    memset(used,false,sizeof(used));
    cin >> sx >> sy >> gx >> gy >> n;
    --sx; --sy; --gx; --gy;
    while(n--){
      int c,d,x,y; cin >> c >> d >> x >> y; --x; --y;
      make_map(x,y,d,c);
    }
    cout << (dfs(sx,sy)? "OK" : "NG") << endl;
  }
}