题目大意:算‘@’连通块个数。
一个格周围八个都算,相邻对角线也算。
注意点是:其实不用visited函数,只搜一次可以优化把搜过的‘@’改成‘*’。
dfs写起来很快。
改成bfs也只花了五分钟不到就过了。
和蔼可亲的一道题。
啪啪啪!
现在可以睡啦。
//uva572 (dfs by zhuhua
//Time limit: 3000 ms
//AC time: 0ms???
#include
#include
#include
using namespace std;
char Map[110][110];
bool visited[110][110];
int m,n;
int dx[8]={1,1,0,-1,-1,-1,0,1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
void dfs(int x,int y)
{
int x2,y2;
visited[x][y]=true;
for(int i=0;i<8;i++)
{
x2=x+dx[i];
y2=y+dy[i];
if(x2>=1&&x2<=m&&y2>=1&&y2<=n
&&Map[x2][y2]=='@'&&!visited[x2][y2])
dfs(x2,y2);
}
}
int main()
{
int i,j,tot;
while(cin>>m>>n)
{
if(m==0)break;
for(i=1;i<=m;i++)
{
scanf("%s",Map[i]+1);
}
memset(visited,0,sizeof(visited));
tot=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(Map[i][j]=='@'&&!visited[i][j])
{
tot++;
dfs(i,j);
}
}
}cout<
//uva572 (bfs by zhuhua
//Time limit: 3000 ms
//AC time: 0 ms???
#include
#include
#include
#include
#include
using namespace std;
char Map[110][110];
int m,n;
int dx[8]= {1,1,0,-1,-1,-1,0,1};
int dy[8]= {0,1,1,1,0,-1,-1,-1};
typedef pair P;
void bfs(int x,int y)
{
Map[x][y]='*';
queue que;
que.push(P(x,y));
while(!que.empty())
{
P out=que.front();
que.pop();
for(int i=0; i<8; i++)
{
int x2=out.first+dx[i];
int y2=out.second+dy[i];
if(x2>=1&&x2<=m&&y2>=1&&y2<=n
&&Map[x2][y2]=='@')
{
Map[x2][y2]='*';
que.push(P(x2,y2));
}
}
}
}
int main()
{
int i,j,tot;
while(cin>>m>>n)
{
if(m==0)break;
for(i=1; i<=m; i++)
{
scanf("%s",Map[i]+1);
}
tot=0;
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
if(Map[i][j]=='@')
{
tot++;
bfs(i,j);
}
}
}
cout<