寶島探險(求島嶼大小,染色法) 寬搜 深搜

在這裏插入圖片描述

寬搜
測試數據:
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;
}

運行結果:
在這裏插入圖片描述

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

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;
}

運行結果:
在這裏插入圖片描述
可以一起討論學習 羣號:891507813

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章