题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1241
题目大意:==》其实就是给你一个图形,问有多少块含‘@’连通(连通包括在同一行、列或对角线)
分八个方向来搜索,我写的时候因为粗细遇到了一些问题,但是自己可以尝试输出中间量来debug==
源代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int m;//记录大小
int n;
const int maxn = 100+5;//最大大小
char mymap[maxn][maxn];//记录形状
int visited[maxn][maxn];//记录有没有被访问过
int dir[8][2] = { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1}};//定义方向向量记录八个方向
//判断所处位置是否在给定形状里面( 是否合法)
bool check( int x, int y)
{
if( x >= 0 && x < m && y >= 0 && y < n)
return true;
return false;
}
void dfs( int x, int y, int ans)
{
int dx;
int dy;
for( int i = 0; i < 8; i++)//以当前位置展开八个方向的搜索
{
dx = x+dir[i][0];
dy = y+dir[i][1];
if( check( dx,dy) && mymap[dx][dy] == '@' && visited[dx][dy] == 0)//
{
visited[dx][dy] = ans;
dfs( dx,dy,ans);
}
}
}
int main()
{
while( scanf("%d%d",&m,&n) == 2 && m && n)
{
for( int i = 0; i < m; i++)
scanf("%s",mymap[i]);//输入形状
int ans = 0;//初始化answer
memset(visited,0,sizeof(visited));
for( int i = 0; i < m; i++)
{
for( int j = 0; j < n; j++)
{
//存在且未被访问过
if( mymap[i][j] == '@' && visited[i][j] == 0)
{
ans++;
visited[i][j] = ans;
dfs( i,j,ans);
}
}
}
printf("%d\n",ans);
}
return 0;
}