HDU1312 深度优先搜索的简单题目
#include<iostream>
using namespace std;struct direction
{
int lr; //左右
int ud; //前后
};
int W,H;
char map[20][20];
bool visit[20][20]={0};//记录点是否已经被访问的数组
direction dd[4]; //四个方向
void dfs(int m,int n)
{
visit[m][n]=1; //访问置位
for(int i=0;i<4;i++)
{
if(m+dd[i].ud>=0 && m+dd[i].ud<W && n+dd[i].lr>=0 && n+dd[i].lr<H && visit[m+dd[i].ud][n+dd[i].lr]==0)
{
if(map[m+dd[i].ud][n+dd[i].lr]=='.')
{
dfs(m+dd[i].ud,n+dd[i].lr);
}
}
}
return ; //最关键的地方,注意理解其本质。。。所有方向均尝试过才返回
}
int main()
{
dd[0].lr=-1; dd[0].ud=0;
dd[1].lr=1; dd[1].ud=0;
dd[2].lr=0; dd[2].ud=1;
dd[3].lr=0; dd[3].ud=-1;
int sx,sy;//记录起始的位置
cin>>W;
cin>>H;
while(W!=0 && H!=0)
{
for(int j=0;j<H;j++)
{
for(int i=0;i<W;i++)
{
visit[i][j]=0;
}
}
for(int j=0;j<H;j++)//for(int i=0;i<W;i++)
{
for(int i=0;i<W;i++)//for(int j=0;j<H;j++)
{
cin>>map[i][j];
if(map[i][j]=='@')
{
sx=i;
sy=j;
}
}
}
dfs(sx,sy);
int sun=0;
for(int j=0;j<H;j++)
{
for(int i=0;i<W;i++)
{
if(visit[i][j]==1)
sun++;
}
}
cout<<sun<<endl;
cin>>W;
cin>>H;
}
return 0;
}