宝岛探险(求岛屿大小,染色法)  宽搜 深搜_算法

宽搜
测试数据:
10 10 6 8
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0

代码:

#include <stdio.h>
struct node{
	int x;
	int y;
};
int main()
{
	struct node que[2501];
	int a[51][51];
	int book[51][51] = {0};
	int next[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
	int n,m,startx,starty,head,tail,i,j,sum,tx,ty;
	//输入地图大小,起始点 
	scanf("%d%d%d%d",&n,&m,&startx,&starty);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	head=1,tail=1;
	que[tail].x = startx;
	que[tail].y = starty;
	tail++;
	book[startx][starty] = 1;
	sum=1;
	while(head<tail)
	{
		for(i=0;i<4;i++)
		{
			//求出下一个方向的点 
			tx = que[head].x+next[i][0];
			ty = que[head].y+next[i][1];
			if(tx<1||tx>n||ty<1||ty>m)
				continue;
			if(a[tx][ty]>0&&book[tx][ty]==0){
				book[tx][ty] = 1;
				que[tail].x = tx;
				que[tail].y = ty;
				tail++;
				sum++;
			} 
		}
		head++;
	}
	printf("%d",sum);
	return 0;
} 

运行结果:38

————————————————————————————————————————

深搜
可以将地图对应位置改成-1,又叫染色法

#include <stdio.h>
int a[51][51];
int book[51][51]={0},n,m,sum;

void dfs(int x,int y,int color)
{
	//定义四个方向
	int next[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
	int i,tx,ty;
	a[x][y]=color;
	//列举四个方向 
	for(i=0;i<4;i++){
		tx = x+next[i][0];
		ty = y+next[i][1];
		//如果越界直接换下一个方向 
		if(tx<1||tx>n||ty<1||ty>m){
			continue;
		}
		//若是陆地并且未曾访问过 
		if(a[tx][ty]>0&&book[tx][ty]==0){
			sum++;
			book[tx][ty]=1;
			dfs(tx,ty,color);
		}
	}
	return; 
}

int main()
{
	int i,j,startx,starty;
	scanf("%d%d%d%d",&n,&m,&startx,&starty);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	book[startx][starty]=1;
	sum=1;
	//从降落的地方开始
	dfs(startx,starty,-1);
	printf("%d\n",sum); 
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++)
			printf("%3d",a[i][j]);
		printf("\n");		
	}

	return 0;
}

运行结果:
宝岛探险(求岛屿大小,染色法)  宽搜 深搜_#include_02

————————————————————————————————————————

3.若想求出整张地图有几个岛屿,用深搜怎么来求

输入条件:
10 10
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0

代码:

#include <stdio.h>
int a[51][51];
int book[51][51]={0};
int n,m,sum;

void dfs(int x,int y,int color)
{
	int next[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
	a[x][y] = color;
	int i,j,tx,ty;
	for(i=0;i<4;i++){
		tx = x+next[i][0];
		ty = y+next[i][1];
		if(tx<1||tx>n||ty<1||ty>m)
			continue;
		if(a[tx][ty]>0&&book[tx][ty]==0){
			book[tx][ty]=1;
			dfs(tx,ty,color);
		}
	}
	return;
}

int main()
{
	int i,j,num=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			{
				
				if(a[i][j]>0){
					num--;
					book[i][j]=1;
					dfs(i,j,num);
				}
					
			}
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++)
			printf("%3d",a[i][j]);
		printf("\n");
	} 
	printf("找到%d个岛屿",-num);
	return 0;
}

运行结果:
宝岛探险(求岛屿大小,染色法)  宽搜 深搜_算法_03
可以一起讨论学习 群号:891507813