dfsはHDU1312の赤と黒の検索水問題を解決します
四角いタイルの長方形の部屋があります。各テクスチャは赤または黒です。黒いタイルの上に一人で立っています。1つのテクスチャから、隣接する4つのテクスチャの1つに移動できます。しかし、彼は赤いテクスチャの上を移動することはできません。彼は黒いテクスチャ上を移動することしかできません。
上記のアクションを繰り返すことで、彼が到達できる黒い四角の数を数えるプログラムを作成します。
入力
入力は、複数のデータセットで構成されます。データセットは、2つの正の整数WとHを含む行で始まります。WとHは、それぞれx方向とy方向のタイルの数です。WとHは20を超えません。
データセットにはH行があり、各行にはW文字が含まれています。以下に示すように、各文字はテクスチャの色を表します。
".-黒いタイル
"# "-赤いステッカー
" @ "-黒いタイルの上に横たわっている人(データセットに1回だけ表示されます)
出力
各データセットについて、プログラムは、最初のテクスチャ(自分自身を含む)から到達できるテクスチャの数を含む行を出力する必要があります。
トピックの主なアイデアは、@でマークされたポイントから「。」でマークされた場所まで歩くことができ、@でマークされた場所が傍受されることです。歩くことができるマップ全体の長さを尋ねてください。
ACコードは以下の通りです
#include<stdio.h>
#include<string.h>
int w,h;//输入地图的大小
char m[25][25];//地图大小
int stax,stay;//开始探索的起始,stax,stay
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};//对该点进行上下左右四个点方向探索
int sum=0;
void dfs(int x, int y)
{
int i,j;
int x1,y1;
for(i=0;i<4;i++)
{
x1=x+dx[i];
y1=y+dy[i];//下左右依次移动
if(m[x1][y1]=='.'&&x>0&&x<=h&&y>0&&y<=w)
{
sum++;
m[x1][y1]='#';//探索后变为#防止二次搜索
dfs(x1,y1);//重复探索
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&w,&h)&&w!=0&&h!=0)
{
getchar();//吸收回车
sum=0;
memset(m, 0, sizeof(m));
for(i=1;i<=h;i++)//输入地图并标记起点
{
for(j=1;j<=w;j++)
{
scanf("%c", &m[i][j]);
if(m[i][j]=='@')
{
stax=i;
stay=j;
m[i][j]='#';//起点算一个'.',标记后将它变成#
}
}
getchar();
}
dfs(stax,stay);
printf("%d\n", sum+1);
}
return 0;
}