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

简介: 宝岛探险(求岛屿大小,染色法) 宽搜 深搜



宽搜:

测试数据:

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


运行结果:



相关文章
|
9月前
【动态规划刷题 5】 最小路径和&&地下城游戏
【动态规划刷题 5】 最小路径和&&地下城游戏
|
1月前
|
存储
每日一题——地下迷宫(迷宫问题II)
每日一题——地下迷宫(迷宫问题II)
|
1月前
|
机器学习/深度学习 存储
leetcode-1036:逃离大迷宫
leetcode-1036:逃离大迷宫
24 0
|
10月前
|
算法
【过河卒】回溯算法保姆式解题
【过河卒】回溯算法保姆式解题
60 0
|
机器学习/深度学习
大臣的旅费-动规/深搜
大臣的旅费-动规/深搜
60 0
|
机器学习/深度学习
剑指offer 13. 剪绳子
剑指offer 13. 剪绳子
55 0
|
C++
【LeetCode343】剪绳子(动态规划)
(1)确定状态 dp[i]是将正整数i拆成2个及其以上的正整数后,求所有数的乘积值。
119 0
【LeetCode343】剪绳子(动态规划)
|
机器学习/深度学习
带你轻松拿捏N皇后问题
要求任何两个皇后不同行、不同列,也不在同一 条斜线上
112 0
带你轻松拿捏N皇后问题
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
大西洋太平洋水流问题 1.题目 2.示例 3.思路 理解题目 解题思路 4.代码
118 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
|
机器学习/深度学习 算法
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题