Problem Description
给你一个n行m列的矩阵,让你判断里面有多少块油田,相邻算是连通
**代码:可以DFS,也可以BFS这次代码用的是DFS也算是给自己熟练下DFS
#include<bits/stdc++.h>
using namespace std;
struct node
{
int u, v;
};
char Map[105][105];
int vis[105][105], ans, n, m;
int x[8] = {1, -1, 0, 0, -1, -1, 1, 1};//八个方向
int y[8] = {0, 0, -1, 1, -1, 1, 1, -1};
vector<node> a;
int judge(int X, int Y)//判断能否走
{
if(X >= 0 && Y >= 0 && X < n && Y < m && Map[X][Y] == '@' && !vis[X][Y])
return 1;
else return 0;
}
void dfs(node t)//遍历完一块
{
vis[t.u][t.v] = 1;//用于标记是否走过
for(int i = 0; i < 8; i++)
{
int x1 = t.u + x[i], y1 = t.v + y[i];
if(judge(x1, y1))
{
dfs((node){x1, y1});
}
}
}
int main()
{
int i, j;
while(~scanf("%d %d", &n, &m))
{
if(n == 0 && m == 0) break;
ans = 0;
for(i = 0; i < n; i++)
{
scanf("%s", Map[i]);
for(j = 0; j < m; j++)
{
if(Map[i][j] == '@')//存入数组
a.push_back((node){i, j});
}
}
memset(vis, 0, sizeof(vis));
for(i = 0; i < a.size(); i++)//遍历
{
if(!vis[a[i].u][a[i].v])//如果没有走过的
{
ans++;//就进去
dfs(a[i]);
}
}
printf("%d\n", ans);
a.clear();
}
return 0;
}