- 迷路POJ - 3984 BFSレコードの出力パスと最短経路

二次元配列の定義:

INT迷路[5] [5] = {
0、1、0、0、0、
0、1、0、1、0、
0、0、0、0、0、
0、1、1、1、0、
0、0、0、1、0、
}。

それは1が壁を表している迷路を表し、どこへ行くか0の方法は、唯一の横に行くことができますまたは垂直に行くために、横に行くことができない、右下隅に左上から最短ルートを見つけるようにプログラムが必要となります。

入力

迷路を示す5×5の2次元配列。データは独自のソリューションを持っていることを確認してください。

出力

右下の最短経路に左、サンプルに示すようにフォーマット。

サンプル入力

0 1 0 0 0 
0 1 0 1 0 
0 0 0 0 0 
0 1 1 1 0 
0 0 0 1 0

サンプル出力

(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)

 

そして、記録パスを出力

 

コード:

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include <アルゴリズム>
 4の#include <iostreamの>
 5の#include <キュー>
 6  使って 名前空間STDを、
7  構造体シュウ
 8  {
 9      int型のY、X、ステップと
10  } STR1、STR2。
11  int型 A、S、D、F、G、Q [ 10 ] [ 10 ]、V [ 10 ] [ 10 ]、W [ 10 ] [ 10 ]、Z [ 25 ]、C [ 25 ]。
12  INTP [ 4 ] [ 2 ] = {{ 10 }、{ 01 }、{ - 10 }、{ 0、 - 1 }}。
13の ボイドBFS()
 14  {
 15      のint XX、YY、X、Y。
16      キュー<集> R。
17      r.push(0009)。
18      ながら(!r.empty())
 19      {
 20          STR1 = r.front()。
21          r.pop()。
22          であれば(str1.y == 4&& str1.x == 4 23          {
 24              XX = Q [str1.y] [str1.x]%10 25              YY =(Q [str1.y] [str1.x] -XX)/ 10 26              一方、1// 循环找寻路径ながら
27              {
 28                  Z [G] = YY; C [G] = XX。
29                  gを++ ;
30                  であれば(Q [YY] [XX] == 0 31                  {
 32                      ブレーク33                  }
 34                  X = Q [YY] [XX]%10 ;    // (我々が以前に保持していたので、同様に座標を見つけるために)以前点座標のポイントを見つける
35                  Y =(Q [YY] [XX]%100 -X-)/ 10 ;
 36                  YY = Y;
 37                  XX = X;
 38である             }
 39              ながら(!r.empty())
 40                  r.pop();
 41である             戻り42である         }
 43で          str2.step = str1.step + 。1 ;
 44である         ためINT I = 0。 I < 4。 ; ++ I)
 45         {
 46は、 
47              str2.y str1.y + P = [I] [ 1 ];
 48              str2.x str1.x + P = [I] [ 0 ];
 49              IF(str2.y < 0 || str2.x < 0 || str2.y> = 5 || str2.x> = 5。続け50              IF(V [str2.y] [str2.x] == 0 && W [str2.y] [str2.x] = = 0 51であり             、{
 52である                  Q [str2.y] [str2.x] = str1.y * 10 + str1.x;   // 一意の値に維持するために、前の点座標にそれを置く
53である                  W [str2.y] 【str2.x] =。1 ;
 54である                 r.push(STR2);
 55                  / * 
56は、                 これに加えて方法、我々はポイントの特殊な記憶構造座標を定義することができる
 57である                 
58                  * / 
59              }
 60          }
 61れる     }
 62れる }
 63であり、 INT main()の
 64  {
 65      G = 0 ;
 66      INT I = 0 ; I < 5 ; ++ Iに)
 67      {
 68          のためにINT J = 0 ; J < 5。 ; ++J)
 69          {
 70              のscanf(" %dの"、&V [I] [J])。
71          }
 72      }
 73      Q [ 0 ] [ 0 ] = 0 ;
74      str1.x = 0 75      str1.y = 0 76      str1.step = 0 77      [W 0 ] [ 0 ] = 1 ;
78の     BFS()。
79      のprintf(" (0、0)\ n " );
80      のためにINT I = G- 1 ; I> = 0 ; - I)
 81      {
 82          のprintf(" (%d個、%d)は\ n " 、Z [I]、C [I])。
83      }
 84      のprintf(" (4,4)\ n " );
85      リターン 0 ;
86 }

おすすめ

転載: www.cnblogs.com/kongbursi-2292702937/p/12044131.html
おすすめ