各点はエッジ点に接続され、それは1が異なる、同じDIS 0次です。
N = 3、各基準点のために、M = 3次のように
1 2 3
4 5 6
7 8 9
参照を開始するようなユニークな配置は、デフォルトのトピックは座標ので、*さえ境界側のM + J $が、決定された$(I-1)を算出した数字(0,0)、タイトルを行うには便利ですが、始まり読みます1とエンドポイントが追加されます。そして、その上に最短パスを実行します
書式#include <iostreamの> の#include <cstdioを> する#include <キュー> の#include <CStringの> 使用して 名前空間はstd; INTのN、M。 int型のEX、EY、PX、PY。 INT [ 505 ] [ 505 ]。 チャー CH [ 255 ]。 構造体ノード{ INT に、NXT、DIS。 } E [ 20000005 ]。 INTヘッド[ 250005 ]、CNT、DIS [ 250005 ] に [ 250005 ]。 インラインボイドアドオン(int型 から、INTに、INT DIS){ E [ ++ CNT] =(ノード){に、ヘッド[ から]、DIS}。 【ヘッドから =] CNT。 } ボイドspfa(){ キュー < INT > Q。 用(int型 iは= 1 ; iがM <= N * ++ i)は DIS [I] = 2000000000、で [I] = 0 ; DIS [(exは - 1)* M + EYは] = 0 ; 中 [(EX- 1)* M + EY] = 1 。 q.push((EX - 1)* M + EY)。 しばらく(!q.empty()){ int型になりました= q.front(); q.pop(); で [今] = 0 ; 以下のために(int型 ; I I = I =ヘッド[今] E [I] .nxt) 場合(DIS [今] + E [i]は.DIS < DIS [E [i]の.TO]){ DIS [Eを[ i]は.TO] = DIS [今] + E [i]の.DIS。 もし(!における[E [i]の.TO]){ q.push(E [I] .TO)。 [E [i]の.TO] = 1 。 } } } のprintf("%d個の\ n "、DIS [(PX- 1)* Mの+ PY])。 } int型のmain(){ 一方(のscanf(" %d個の%のD "、&N、&M)){ 場合(N == 0 && m個の== 0)ブレーク。 CNT = 0 ; memsetの(頭、0、はsizeof (ヘッド))。 用(int型 iは= 1 ; iが<= N ++ {I) のscanf(" %sの"、CH +1 ); ために(int型の J = 1 ; J <= M; ++ J){ 場合(CH [J] == ' @ ')[I] [J] = 1 。 他の [i] [j]は= 0を。 } } のための(int型 i = 1 ; iが<= N; ++ I) のために(INT J = 1 ; J <= M; ++ J){ 場合(I> 1 ) ((I追加 - 1)* Mを+ J、(I- 2)* M + J、[I] [J] ^ [I- 1] [j]は)、追加((I- 2)* M + J、(I- 1)* M + J、[I] [J] ^ [I- 1 ] [J])。 場合(iは< N)が 追加((I - 1)* M + jは、i *が+ jはM、[I] [J] ^ [I + 1 ] [J])、iはJ *を+ M(追加(I- 1)* M + J、[I] [J] ^ [I + 1 ] [J])。 もし(j> 1 ) を追加((I - 1)* M + J、(I- 1)* M + J- 1、[I]、[J] ^ [I] [J- 1 ])を追加((I- 1)* M + J- 1、(I- 1)* M + J、[I] [J] ^ [I] [J-1 ])。 場合(j < mは) 追加((I - 1)* M + J、(I- 1)* M + J + 1、[I]、[J] ^ [I] [J + 1 ])、((追加I- 1)* M + J + 1、(I- 1)* M + J、[I] [J] ^ [I] [J + 1 ])。 } のscanf(" %D%D%D%D "、&EX、EY&&PX、&PY)。 EX ++; EY ++; PX ++; PY ++ ; spfa(); } 戻り 0 。 }