#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
int m,n;
char map[110][110];
int num;
int dir[8][2] ={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
//这是一种坐标移动办法
/*
还有另外一种,这样也是可以的,但我觉得用数组把坐标移动方式记录下来,这样方便一点
DFS(p - 1, q - 1);
DFS(p - 1, q);
DFS(p - 1, q + 1);
DFS(p, q - 1);
DFS(p, q + 1);
DFS(p + 1, q - 1);
DFS(p + 1, q);
DFS(p + 1, q + 1);
第三种是吧x和y的移动的坐标 分开写,比如这样
int movex[8]={1,1,1,-1,-1,-1,0,0},movey[8]={1,0,-1,1,0,-1,1,-1};
}
*/
void Dfs(int t,int u)
{
int i,a,b;
map[t][u] = '*';
for( i = 0 ; i < 8 ; i ++)
{
a = t + dir[i][0]; //x 坐标的移动
b = u + dir[i][1]; //y 坐标的移动
if(( a >= 0)&& (a < m) && (b >= 0) && (b < n)&&map[a][b] == '@')
{
Dfs(a,b);
}
}
}
int main()
{
int i , j ;
while(scanf("%d%d",&m,&n) && m )
{
num = 0;
memset(map,0,sizeof(map));
for(i = 0 ; i < m ; i ++)
{
scanf("%s",map[i]);
}
for( i = 0 ; i < m ; i ++)
{
for(j = 0; j < n ; j ++)
{
if(map[i][j] == '@')
{
num++;
Dfs(i,j);
}
}
}
printf("%d\n",num);
}
return 0;
}
第二种完整的代码:
#include <stdio.h>
#include <string.h>
#define MAXN 100 + 10
char graph[MAXN][MAXN];
int count;
int m, n;
void DFS(int p, int q);
int main()
{
int i, j;
while(scanf("%d%d", &m, &n) && m != 0)
{
// 初始化
count = 0;
memset(graph, 0, sizeof(graph));
// 数据输入
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
scanf("\n%c", &graph[i][j]);
}
}
// 算法主体
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
if(graph[i][j] == '@')
{
DFS(i, j);
count++;
}
// 数据输出
printf("%d\n", count);
}
return 0;
}
void DFS(int p, int q)
{
if(p >= 0 && p <= m - 1 && q >= 0 && q <= n - 1 && graph[p][q] == '@')
{
graph[p][q] = '*';//把遍历过的 @ 变成 * 防止遍历其他的点的时候,误判
}
else
{
return;
}
//第二种的便利八个方向上的点,就是直接移动,没有调数组
DFS(p - 1, q - 1);
DFS(p - 1, q);
DFS(p - 1, q + 1);
DFS(p, q - 1);
DFS(p, q + 1);
DFS(p + 1, q - 1);
DFS(p + 1, q);
DFS(p + 1, q + 1);
}
第三种呢就是把x的移动存为一个数组,把Y的移动存为一个数组
下面是代码
//这个是第三种啦
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 101
using namespace std;
int n,m,ans;
char map[MAX][MAX];
bool vis[MAX][MAX];
int movex[8]={1,1,1,-1,-1,-1,0,0},movey[8]={1,0,-1,1,0,-1,1,-1};
bool isborder(int x,int y)
{
if(x<0||x>=n||y<0||y>=m)
return true;
return false;
}
void DFS(int x,int y)
{
if(isborder(x,y)||map[x][y]=='*')
return;
for(int i=0;i<8;i++)
{
int itx=x+movex[i];
int ity=y+movey[i];
if(isborder(itx,ity)||vis[itx][ity])
continue;
vis[itx][ity]=1;
if(map[itx][ity]=='@')
DFS(itx,ity);
}
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=0;i<n;i++)
scanf("%s",&map[i]);
memset(vis,0,sizeof(vis));
ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(!vis[i][j]&&map[i][j]!='*')
{
DFS(i,j);
ans++;
}
printf("%d\n",ans);
}
return 0;
}
其实我觉得这三种都是差不多的,反正你自己开心就好,另外还有人用的是bfs做出来的,bfs现在暂时还没研究~