第16周 啊哈算法 宝岛探险(下落到某一点求宝岛面积)

本文通过两种算法——广度优先搜索(BFS)和深度优先搜索(DFS),详细解析了求解岛屿面积的问题,并展示了如何使用DFS算法的不同变种来解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题及代码:

/*宝岛探险:用广度优先搜索算法求岛屿的面积*/    
#include<stdio.h>

struct note
 {
   int x;
   int y;
  };

int main()
 {
   struct note q[100];
   int a[10][10];
   int book[10][10];
   int i,j,k,tx,ty,n,m,mx,my,startx,starty,sum;
   int head,tail;
  
   int next[4][2]={{0,1},{1,0},{-1,0},{0,-1}};

   scanf("%d %d %d %d",&n,&m,&startx,&starty);
    
   for(i=0;i<n;i++)
     for(j=0;j<n;j++)
        scanf("%d",&a[i][j]);
 
   head=1;
   tail=1;

   q[tail].x=startx;
   q[tail].y=starty;
   tail++;
   book[startx][starty]==1;    
   sum=1;

while(head<tail)
 {
   for(k=0;i<3;k++)
    {
      tx=q[head].x+next[k][0];
      ty=q[head].y+next[k][1];
      
          if(tx<0||tx>n||ty<0||ty>n)
            continue;
          if(a[tx][ty]>0 &&book[tx][ty]==0) //海洋用0表示,陆地是1-9
            {
              sum++;
              book[tx][ty]==1;
              q[tail].x=tx;
              q[tail].y=ty;
              tail++;
            }
    }
      printf("%d",sum);
     
      getchar();getchar();
      return 0;
 }
}

/*宝岛探险:深度优化算法解答*/    
#include<stdio.h>

int a[50][51];
int book[50][50];
int n,m,sum;

void dfs(int x,int y)
 {
   int k,tx,ty;
   int next[4][2]={{0,1},
                   {1,0},
                   {0,-1},
                   {-1,0}};
  
   for(k=0;k<4;k++)
    {
      tx=x+next[k][0];
      ty=y+next[k][1];

      sum++;
      book[tx][ty]==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);
       }
    }
  return;
 }


int main()
 {
   int i,j,startx,starty;
   scanf("%d %d %d %d",&n,&m,&startx,&starty);
 
   for(i=0;i<n;i++)
    for(j=0;i<m;j++)
     scanf("%d",&a[i][j]);

   book[startx][starty]==1;
   sum=1;
 
   dfs(startx,starty);
   printf("%d\n",sum);
   getchar();getchar();
   return 0;
 }
   

/*着色法:在深度优化搜索里增加color的参数*/
#include<stdio.h>

int a[50][51];
int book[50][50];
int n,m,sum;
void dfs(int x,int y,int color)
 {
   int k,tx,ty;
   int next[4][2]={{0,1},
                   {1,0},
                   {0,-1},
                   {-1,0}};
   a[x][y]=color;//对当前格子染色
  
   for(k=0;k<4;k++)
    {
      tx=x+next[k][0];
      ty=y+next[k][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);//用-1表示对齐进行染色 
   
  for(i=1;i<=n;i++)
   {
    for(j=1;j<=m;j++)
     {
       printf("%3d",a[i][j]);
      }
     printf("\n");
    }
    getchar();getchar();
    return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值