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 := pq[0]
		pq = pq[1:]
		if now.Person.Distance() == 0 && ans > now.Turn {
			ans = now.Turn
		}
		if ans <= now.Turn {
			continue
		}

		if _, ok := memo[now.Person]; ok {
			continue
		}
		memo[now.Person] = 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<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int m[50][50];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int bfs[50][50][50][50];
struct wolf{
	int a,b,c,d;
	wolf(int A,int B,int C,int D){
		a=A;
		b=B;
		c=C;
		d=D;
	}
};
int main(){
	int a,b;
	while(scanf("%d%d",&a,&b),a+b){
		int r1,r2,c1,c2;
		scanf("%d%d%d%d",&c1,&r1,&c2,&r2);
		for(int i=0;i<b;i++)
			for(int j=0;j<a;j++)
				scanf("%d",&m[i][j]);
		int inf=999999999;
		for(int i=0;i<b;i++)
			for(int j=0;j<a;j++)
				for(int k=0;k<b;k++)
					for(int l=0;l<a;l++)
						bfs[i][j][k][l]=inf;
		r1--;c1--;r2--;c2--;
		bfs[r1][c1][r2][c2]=0;
		queue<wolf> Q;
		Q.push(wolf(r1,c1,r2,c2));
		while(Q.size()){
			wolf at=Q.front();
			Q.pop();
		//	if(bfs[at.a][at.b][at.c][at.d]==99)continue;
			for(int i=0;i<4;i++){
				int s1=at.a+dx[i];
				int t1=at.b+dy[i];
				int s2=at.c-dx[i];
				int t2=at.d-dy[i];
				if(s1<0||s1>=b||m[s1][t1])s1-=dx[i];
				if(t1<0||t1>=a||m[s1][t1])t1-=dy[i];
				if(s2<0||s2>=b||m[s2][t2])s2+=dx[i];
				if(t2<0||t2>=a||m[s2][t2])t2+=dy[i];
				if(bfs[s1][t1][s2][t2]==inf){
					bfs[s1][t1][s2][t2]=bfs[at.a][at.b][at.c][at.d]+1;
					Q.push(wolf(s1,t1,s2,t2));
				}
			}
		}
		int ret=inf;
		for(int i=0;i<b;i++)for(int j=0;j<a;j++)ret=min(ret,bfs[i][j][i][j]);if(ret>=100)printf("NA\n");else printf("%d\n",ret);
	}
}

C++: #include<iostream>
#include<queue>
using namespace std;
struct xy{
  int tx,ty;
  int kx,ky;
  int ti;
};
int x,y;
xy tk;
int m[51][51],vt[51][51]={},vk[51][51]={};
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};

bool g(int a,int b){
  if(a<=0 || a>x || b<=0 || b>x) return 0;
  return 1;
}

int bfs(){
  queue<xy> q;
  xy t,tmp;
  int ta,tb,ka,kb,ans=10000,tim;
  q.push(tk);
  while(!q.empty()){
    t=q.front(),q.pop();
      for(int i=0;i<4;i++){
      ta=t.tx+dx[i],tb=t.ty+dy[i],ka=t.kx-dx[i],kb=t.ky-dy[i],tim=t.ti+1;
      if(g(ta,tb) || g(ka,kb)){
	if(vt[ta][tb]==2 && vt[ta][tb]==2)continue;
	if(m[ta][tb]==1 && m[ka][kb]==1) continue;
	if(m[ta][tb]==1) tmp.tx=t.tx,tmp.ty=t.ty;
	else if(vt[ta][tb]==0 && m[ta][tb]!=1)tmp.tx=ta,tmp.ty=tb,vt[ta][tb]=2;
	
	if(m[ta][tb]==1) tmp.kx=t.kx,tmp.ky=t.ky;
	else if(vk[ka][kb]==0 && m[ka][kb]!=1)tmp.kx=ka,tmp.ky=kb,vt[ta][tb]=2;
	
	tmp.ti=tim;
	if(tmp.ti>=100)  break;
	if(tmp.tx==tmp.kx && tmp.ky==tmp.ty){
	  if(ans>tmp.ti) ans=tmp.ti;
	  continue;
	}
	q.push(tmp);
      }
    }
  }
  return ans;
}

int main(){
  while(1){
    int ans;
    cin>>x>>y;
    if(x+y==0) break;
    cin>>tk.tx>>tk.ty>>tk.kx>>tk.ky;
    for(int i=1;i<=x;i++)
      for(int j=1;j<=y;j++) vt[i][j]=0,vk[i][j]=0;
    tk.ti=0;
    for(int i=1;i<=x;i++)
      for(int j=1;j<=y;j++)  cin>>m[i][j];
    ans=bfs();
    if(ans<100) cout<<ans<<endl;
    else cout<<"NA"<<endl;
  }
  
  return 0;
}

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

#define REP(i,a,b) for(i=a;i<b;++i)
#define rep(i,n) REP(i,0,n)
const int inf = 1<<29;

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int memo[50][50][50][50],mp[50][50];
int X,Y,tx,ty,kx,ky;

struct State{
  int tx,ty,kx,ky;
  State(int tx,int ty,int kx,int ky) : tx(tx), ty(ty), kx(kx), ky(ky) {;}
  State() {;}
};

inline bool range(int x,int m) {
  return (x >= 0 && x < m);
}

bool ok(int tx,int ty,int kx,int ky) {
  if(range(tx,X) && range(ty, Y) && range(kx, X) && range(ky, Y)
     && mp[ty][tx] == 0 && mp[ky][kx] == 0) return true;
  return false;
}

int main() {
    int i,j,k,l,ans;
    while(cin>>X>>Y, X|Y) {
      cin>>tx>>ty>>kx>>ky;
      tx--,ty--,kx--,ky--;
      rep(i,50) rep(j,50) rep(k,50) rep(l,50) memo[i][j][k][l] = inf;
      ans = inf;
      memo[tx][ty][kx][ky] = 0;

      rep(i,Y) {
	rep(j,X) {
	  cin>>k;
	  mp[i][j] = k;
	}
      }

      queue<State> Q;
      Q.push(State(tx,ty,kx,ky));
      while(!Q.empty()) {

	State now = Q.front(); Q.pop();
	if(now.tx == now.kx && now.ty == now.ky) {
	  ans = memo[now.tx][now.ty][now.kx][now.ky];
	  break;
	}

	rep(i,4) {
	  int ntx = now.tx+dx[i],nty = now.ty+dy[i];
	  int nkx = now.kx-dx[i],nky = now.ky-dy[i];
	  if(ok(ntx,nty,nkx,nky) && memo[ntx][nty][nkx][nky] == inf) {
	    memo[ntx][nty][nkx][nky] = memo[now.tx][now.ty][now.kx][now.ky]+1;
	    Q.push(State(ntx,nty,nkx,nky));
	  }
	}
      }

      if(ans < inf) cout<<ans<<endl;
      else cout<<"NA"<<endl;
    }
}