#include <iostreamの>
する#include <cstdioを>
する#include <キュー>
使用して 名前空間STD;
チャールーム[ 25 ] [ 25 ];
INT [DIR 。4 ] [ 2 ] = {{ - 1、0 }、{ 0、 - 1。 }、{ 1、0 }、{ 0、1 }};
int型Wxを、Hyは、NUMの;
// Wxを、Hyとの:境界線の長さと幅、NUM:タイルの初期総数からタイル到達する
の#defineに CHECKを(X 、Y)(X <&& WxをXの> = 0 && Y> = 0 && Y <Hyの)
// チェック境界か
構造体ノード
{
int型のX、Y。
}。
ボイド BFS(INT DX、INT DY)
{
キュー <ノード> Q。
ノードの横、スタート。
start.x = DX。
start.y = DY。
q.push(スタート)。// 把当前节点入队
ながら(!q.empty())
{
開始 = q.front()。
q.pop();
以下のために(INT iが= 0 ; I < 4 ; ++ I)
{
next.x = start.x + DIR [I] [ 0 ]。
next.y = + start.y DIR [I] [ 1 ];
IF(CHECK(next.x、next.y)&&ルーム[next.x] [next.y] == ' ' )
{
ルーム[次に.X] [next.y] = ' #' ; // 現在のノードのタグがなくなった
NUM ++を; // ステップ数をインクリメント
q.push(次へ); // 子ノードエンキュー }
}
}
} int型メイン()
{ int型のX、Y、DX、Dyを;
// DX、Dyのヒト局一方(WxをのCIN >> のHy)
{
もし(Wxの== 0 && Hyの== 0 )
{
ブレーク。
}
のために(Y = 0 ; Y <Hyと; ++ Y)
{
ための(X = 0 ; X <Wxを、++ X)
{
CIN >> ルーム[X] [Y]。
もし(部屋[X] [Y] == ' @ ' )
{
DX = X。
DY = Y。
}
}
}
NUM =1 ;
BFS(DX、DY)。
coutの << NUM << てendl;
}
戻り 0 。
}