Go: package main

import (
	"fmt"
	"math"
)

type Position struct {
	X int64
	Y int64
}

func (one Position) Distance(another Position) int64 {
	return int64(math.Abs(float64(one.X-another.X)) + math.Abs(float64(one.Y-another.Y)))
}

type PersonPosition struct {
	Takayuki Position
	Kazuyuki Position
}

func (one PersonPosition) Distance() int64 {
	return one.Takayuki.Distance(one.Kazuyuki)
}

type Status struct {
	Person PersonPosition
	Turn   int64
}

type PQStatus []*Status

func solve(h, w int64) {
	var tx, ty, kx, ky int64
	fmt.Scan(&tx, &ty, &kx, &ky)
	tx--
	ty--
	kx--
	ky--
	m := make([][]int64, h)
	for i := range m {
		m[i] = make([]int64, w)
		for j := int64(0); j < w; j++ {
			fmt.Scan(&m[i][j])
		}
	}
	start := &Status{Person: PersonPosition{Takayuki: Position{X: tx, Y: ty}, Kazuyuki: Position{X: kx, Y: ky}}, Turn: 0}
	pq := make(PQStatus, 0)
	pq = append(pq, start)
	dx := []int64{0, 1, 0, -1}
	dy := []int64{1, 0, -1, 0}
	memo := make(map[PersonPosition]int64, 0)
	ans := int64(102)
	for len(pq) > 0 {
		now := &Status{}
		now = pq[0]
		pq = pq[1:]
		if ans <= now.Turn {
			continue
		}
		if _, ok := memo[now.Person]; ok {
			continue
		}
		memo[now.Person] = now.Turn

		if now.Person.Distance() == 0 && ans > now.Turn {
			ans = now.Turn
		}

		for i := 0; i < 4; i++ {
			next := &Status{}
			next = now
			next.Person.Kazuyuki.X += dx[i]
			next.Person.Kazuyuki.Y += dy[i]
			if next.Person.Kazuyuki.X < 0 || next.Person.Kazuyuki.X >= w ||
				next.Person.Kazuyuki.Y < 0 || next.Person.Kazuyuki.Y >= h ||
				m[next.Person.Kazuyuki.Y][next.Person.Kazuyuki.X] == 1 {
				next.Person.Kazuyuki.X -= dx[i]
				next.Person.Kazuyuki.Y -= dy[i]
			}
			next.Person.Takayuki.X -= dx[i]
			next.Person.Takayuki.Y -= dy[i]
			if next.Person.Takayuki.X < 0 || next.Person.Takayuki.X >= w ||
				next.Person.Takayuki.Y < 0 || next.Person.Takayuki.Y >= h ||
				m[next.Person.Takayuki.Y][next.Person.Takayuki.X] == 1 {
				next.Person.Takayuki.X += dx[i]
				next.Person.Takayuki.Y += dy[i]
			}
			next.Turn++
			if next.Turn <= 100 {
				pq = append(pq, next)
			}
		}
	}
	if ans == 102 {
		fmt.Println("NA")
	} else {
		fmt.Println(ans)
	}
}

func main() {
	var h, w int64
	for {
		fmt.Scan(&h, &w)
		if h == 0 && w == 0 {
			break
		}
		solve(h, w)
	}
}

C++: #include <algorithm>
#include <map>
#include <vector>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
#include <set>
using namespace std;

#define REP(i,n) for(int i=0; i<n; ++i)
#define IREP(it,array) for(vector<int>::iterator it=array.begin(); it!=array.end(); ++it)
#define PREP(it,array) for(vector<P>::iterator it=array.begin(); it!=array.end(); ++it)
#define SREP(it,array) for(vector<string>::iterator it=array.begin(); it!=array.end(); ++it)

#define MP       make_pair
#define PB       push_back
#define ALL(x)   (x).begin(),(x).end()

const int INF = 1<<29;
const double EPS = 1e-9;
double zero(double d){
  return d < EPS ? 0.0 : d;
}

typedef long long LL;
typedef pair<int,int> P;

int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};

struct Sta{
  int ax,ay;
  int bx,by;
  int count;
};

int main()
{
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(7);

  int X,Y;
  while( cin>>X>>Y, X ){
    int tx,ty;
    cin >>tx>>ty;

    int kx,ky;
    cin>>kx>>ky;

    bool dep[Y+1][X+1];
    REP(i,Y){
      REP(j,X){
	int ttt;
	cin >> ttt;
	dep[i+1][j+1] = ttt;
      }
    }

    bool used[X+1][Y+1][X+1][Y+1];
    memset( used, 0, sizeof(used) );

    queue<Sta> que;
    Sta s;
    s.ax = tx;
    s.ay = ty;
    s.bx = kx;
    s.by = ky;
    s.count = 0;
    que.push(s);

    int res=101;
    while( ! que.empty() ){
      Sta t = que.front(); que.pop();
      if( t.ax == t.bx && t.ay == t.by ){
	res = t.count;
	break;
      }

      if( t.count >= 100 ){
	break;
      }
	
      REP(i,4){
	Sta t2 = t;
	t2.count++;

	int nAx = t2.ax + dx[i];
	int nAy = t2.ay + dy[i];
	int nBx = t2.bx + dx[(i+2)%4];
	int nBy = t2.by + dy[(i+2)%4];
	if( 0<nAx && nAx <= X && 0<nAy && nAy<=Y ){
	  if( ! dep[nAy][nAx] ){
	    t2.ax = nAx;
	    t2.ay = nAy;
	  }
	}
	if( 0<nBx && nBx <= X && 0<nBy && nBy<=Y ){
	  if( ! dep[nBy][nBx] ){
	    t2.bx = nBx;
	    t2.by = nBy;
	  }
	}

	if( ! used[t2.ax][t2.ay][t2.bx][t2.by] ){
	  used[t2.ax][t2.ay][t2.bx][t2.by] = true;
	  que.push(t2);
	}
      }
    }

    if(res==101)
      cout << "NA" << endl;
    else
      cout << res << endl;
  }

  return 0;
}

C++: #include <bits/stdc++.h>

using namespace std;

#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) (v).begin(),(v).end()
#define fi first
#define se second

template<typename A, typename B> inline bool chmax(A &a, B b) { if (a<b) { a=b; return 1; } return 0; }
template<typename A, typename B> inline bool chmin(A &a, B b) { if (a>b) { a=b; return 1; } return 0; }

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<int, pii> pip;
typedef pair<pii, pii> ppp;
typedef pair<int, ppp> P;
const ll INF = 1ll<<29;
const ll MOD = 1000000007;
const double EPS  = 1e-9;

int W, H;
pii tp, kp;
int maps[50][50];
bool done[50][50][50][50];

int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};

bool ok(pii p) {
	if (!(p.fi >= 0 && p.fi < H && p.se >= 0 && p.se < W)) return false;
	if (maps[p.fi][p.se] == 1) return false;
	return true;
}

int main() {
	while (cin >> W >> H, W || H) {
		cin >> tp.se >> tp.fi >> kp.se >> kp.fi;
		tp.se--; tp.fi--; kp.se--; kp.fi--;
		REP(i, H) REP(j, W) scanf("%d", &maps[i][j]);
		
		memset(done, 0, sizeof(done));
		queue<P> que;
		que.push(P(0, ppp(tp, kp)));
		done[tp.fi][tp.se][kp.fi][kp.se] = true;
		
		int ans = INF;
		
		while (!que.empty()) {
			int c = que.front().fi;
			pii p1 = que.front().se.fi, p2 = que.front().se.se;
			que.pop();
			
			if (p1 == p2) { ans = c; break; }
			if (c >= 100) break;
			
			done[p1.fi][p1.se][p2.fi][p2.se] = true;
			
			REP(i, 4) {
				pii np1(p1.fi + dy[i], p1.se + dx[i]);
				pii np2(p2.fi + dy[(i+2)%4], p2.se + dx[(i+2)%4]);
				
				bool o1 = ok(np1), o2 = ok(np2);
				if (!o1 && !o2) continue;
				
				np1 = o1 ? np1 : p1;
				np2 = o2 ? np2 : p2;
				if (done[np1.fi][np1.se][np2.fi][np2.se]) continue;
				que.push(P(c + 1, ppp(np1, np2)));
			}
		}
		
		if (ans == INF) puts("NA");
		else cout << ans << endl;
		
	}
	return 0;
}

C++: #include<iostream>
#include<queue>
#include<map>
using namespace std;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
class state {
public:
	int tx;
	int ty;
	int kx;
	int ky;
	int time;
	bool operator < (const state &s)const {
		if (ty != s.ty)return ty < s.ty;
		if (tx != s.tx)return tx < s.tx;
		if (ky != s.ky)return ky < s.ky;
		if (kx != s.kx)return kx < s.kx;
		return false;
	}
};
int main() {
	while (true) {
		int W, H;
		cin >> W >> H;
		if (W == 0 && H == 0)
			break;
		bool d[52][52];
		for (int i = 0; i < H + 2; i++) {
			for (int j = 0; j < W + 2; j++) {
				d[i][j] = 1;
			}
		}
		state num;
		cin >> num.tx >> num.ty >> num.kx >> num.ky;
		for (int i = 1; i < H + 1; i++) {
			for (int j = 1; j < W + 1; j++) {
				cin >> d[j][i];
			}
		}
		num.time = 0;
		queue<state> q;
		q.push(num);
		map<state, bool> m;
		m[num] = true;
		while (true) {
			num = q.front();
			q.pop();
			if (num.time >= 100) {
				cout << "NA" << endl;
				break;
			}
			if (num.tx == num.kx && num.ty == num.ky) {
				cout << num.time << endl;
				break;
			}
			for (int i = 0; i < 4; i++) {
				state copy = num;
				copy.time += 1;
				if (d[copy.ty + dy[i]][copy.tx + dx[i]] == 0) {
					copy.ty += dy[i];
					copy.tx += dx[i];
				}
				if (d[copy.ky - dy[i]][copy.kx - dx[i]] == 0) {
					copy.ky -= dy[i];
					copy.kx -= dx[i];
				}
				if (m.find(copy)==m.end()) {
					q.push(copy);
					m[copy] = true;
				}
			}
			if (q.empty()) {
				cout << "NA" << endl;
				break;
			}
		}
	}
	return 0;
}