Problem:
迷子の双子

たかゆき君とかずゆき君は仲良しの双子ですが、行動が真逆です。 例えば、たかゆき君が西に行けば、かずゆき君は東へ行き、かずゆき君が北へ行けば、たかゆき君は南へ行きます。 現在 2 人はデパートに来ており、別々の場所にいます。真逆に移動してしまう 2 人ができるだけ早く出会うためにはどうしたらよいでしょうか?

デパートは横 W 個 × 縦 H 個のマスで構成されるグリッドで表され、2 人は単位時間に東西南北に 1 マス分移動することができます。ただし、グリッドの範囲外や障害物のあるマスに移動することはできません。

図のように、グリッドのマスの位置は座標 (x, y) で表されます。

グリッドの情報と 2 人の初期位置を入力とし、2 人が出会うまでの最短の時間を出力するプログラムを作成してください。出会うことができない場合や、出会うのに 100 以上の時間を要する場合は、NA と出力してください。グリッドの情報は、H 行 W 列の数字、2 人の位置情報は座標によって与えられます。

移動後にたかゆき君かかずゆき君のうち、どちらか一方が障害物やグリッドの範囲外に位置してしまうときには、移動ができないので、障害物やグリッドの範囲外に位置する方は元の場所に戻りますが、そうでない方は元の場所に戻ることなく動くことができます。

なお、2 人が出会うとは、移動後に 2 人が同じマスに止まることを言います。2 人がすれ違っても、出会ったことにはなりません。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

W H
tx ty
kx ky
d11 d21 ... dW1
d12 d22 ... dW2
:
d1H d2H ... dWH

1 行目にデパートの大きさW, H (1 ≤ W, H ≤ 50) が与えられます。2 行目にたかゆき君の初期位置 tx, ty、3 行目にかずゆき君の初期位置 kx, ky が与えられます。

続く H 行にデパートの情報が与えられます。di,j はマス (i, j) の種類を表し、0 のとき移動可能なマス、1 のとき障害物があるマスを表します。

データセットの数は 100 を超えません。

Output

入力データセットごとに、最短の時間を１行に出力します。

Sample Input

6 6
2 4
6 2
0 0 0 0 1 0
0 1 0 0 0 0
0 1 0 0 0 0
0 0 0 1 0 0
0 0 0 0 0 1
0 0 0 0 0 0
3 3
1 1
3 3
0 0 0
0 1 0
0 0 0
0 0

Output for the Sample Input

3
NA

Solution in PHP (judge verdict: Runtime Error)

<?php
//幅優先探索
$file_handle = fopen('php://stdin', "r");

$move = array(array(1,0), array(-1,0), array(0,1), array(0,-1));

//bfs
function bfs() {
    //グローバル変数定義
    global $move, $map, $sec, $start_t, $start_k;
    
    $queue[0]['t'] = $start_t;
    $queue[0]['k'] = $start_k;
    $queue[0]['sec'] = 0;
    
    while (!empty($queue)) {        //$queueが1つ以上あればループ
       $cur = array_shift($queue);  //$queueの『頭』から１つ取り出す。
       
       //終了条件
       if ($cur['t'][0]==$cur['k'][0] && $cur['t'][1]==$cur['k'][1]){
           $sec = $cur['sec'];  //ゴールした時の秒数
           break;
       }
       //100秒以上経過したら強制終了
       if ($cur['sec'] >= 100) break;
              
       //現在のキューを探索済みに
	   $visited[$cur['t'][0]][$cur['t'][1]][$cur['k'][0]][$cur['k'][1]] = 1;  //二人の座標を[x][y][x][y]と入れる
       
       //探索ロジック（迷路でいうと動いた先に道が続いているかどうか判定する部分）
       for ($i=0; $i<=3; ++$i) {
           $tx = $cur['t'][0] + $move[$i][0];
           $ty = $cur['t'][1] + $move[$i][1];
           //ｋは逆方向に動く
           if($i===0){
	           $kx = $cur['k'][0] + $move[1][0];
	           $ky = $cur['k'][1] + $move[1][1];
           } elseif($i===1){
	           $kx = $cur['k'][0] + $move[0][0];
	           $ky = $cur['k'][1] + $move[0][1];
           } elseif($i===2){
	           $kx = $cur['k'][0] + $move[3][0];
	           $ky = $cur['k'][1] + $move[3][1];
           } elseif($i===3){
	           $kx = $cur['k'][0] + $move[2][0];
	           $ky = $cur['k'][1] + $move[2][1];
           }
           //未探索かどうかチェック
           if (isset($visited[$tx][$ty][$kx][$ky])) continue;
           
           $new = $cur;
           $move_flag = 0;	//両者とも移動しなければ$queueには追加しない
           
           //そこにマップがあり且つ、障害物で無ければ
           if (isset($map[$tx][$ty]) && $map[$tx][$ty]==0) {
               $new['t'] = array($tx, $ty);
               $move_flag = 1;
           }
           if (isset($map[$kx][$ky]) && $map[$kx][$ky]==0) {
               $new['k'] = array($kx, $ky);
               $move_flag = 1;
           }
           if ($move_flag===1){
               $new['sec'] = $cur['sec'] + 1;
               array_push($queue, $new);
           }
       }
    }
}


while (1){
	//変数の初期化
	$sec = false;
	unset($map);

	//ファイル読み込み
	$info = fscanf($file_handle, '%d %d');
	$x = $info[0]; $y = $info[1];
	//終了条件
	if ($x === 0){
		break;
	}
	
	//たかゆき初期位置
	$info2 = fscanf($file_handle, '%d %d');
	$start_t = array($info2[0], $info2[1]);
	
	//かずゆき初期位置
	$info3 = fscanf($file_handle, '%d %d');
	$start_k = array($info3[0], $info3[1]);
	
	//map情報を格納
	for ($i=1; $i<=$y; ++$i){
		$stdin = trim(fgets($file_handle));
		$e = explode(' ', $stdin);
		for ($j=1; $j<=$x; ++$j){
			$map[$j][$i] = $e[$j-1];
		}
	}
	
	//探索
	bfs();
	
	//出力
	if ($sec===false){
		echo 'NA';
	} else {
		echo $sec;
	}
	echo PHP_EOL;
}
fclose($file_handle);