P4554暁明ゲーム

各点はエッジ点に接続され、それは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 
}

 

  

おすすめ

転載: www.cnblogs.com/sanjinliushi/p/11520235.html