原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
分析:简单的BFS。使用广搜,使每个满足添加的点进队列,统计删除的点,有多少个点被删除就有多少个满足题意的点。
我的代码:
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
char map[21][21];
bool visited[21][21];
int x[]={0,0,1,-1};
int y[]={1,-1,0,0};
int n,m; //n是行数,m是列数。
struct Node
{
int x,y;
};
queue<Node> Q;
Node S;
int sx,sy;
int ans;
void BFS(Node S)
{
while(!Q.empty()) Q.pop();
Q.push(S);
visited[S.x][S.y]=1;
while(!Q.empty())
{
Node T=Q.front();
Q.pop();
ans++;
for(int i=0;i<4;i++)
{
int nx=T.x+x[i];
int ny=T.y+y[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&map[nx][ny]=='.'&&!visited[nx][ny])
{
visited[nx][ny]=1;
Node P;
P.x=nx;
P.y=ny;
Q.push(P);
}
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF&&(n+m))
{
int i,j;
getchar();
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
visited[i][j]=0;
if(map[i][j]=='@')
{
S.x=i;
S.y=j;
}
}
getchar();
}
ans=0;
BFS(S);
printf("%d\n",ans);
}
return 0;
}
总结:这几天做搜索专题,对搜索越来越有感觉了 ..O(∩_∩)O