zoukankan      html  css  js  c++  java
  • 最大岛屿

    同样的题目,解法不同

    前一次是深度优先搜索

    这一次是广度优先搜索

    代码

    #include<stdio.h>
    #include<queue>
    using namespace std;
    int L,n,m,s;
    int f[8][2]={0,-1,0,1,-1,0,1,0,-1,1,1,1,1,-1,-1,-1},a[505][505];
    struct node
    {
    int x,y;              //定义队列
    };
    queue<node>Q;
    int bfs(int x,int y)
    {
    int L=0;
    node q;
    q.x=x;
    q.y=y;
    Q.push(q);          //把找到的岛屿入队
    L++;
    a[q.x][q.y]=0;
    while(!Q.empty())      //为空说明遍历完成,即完整找到一块岛屿
    {
    node e,w;
    e=Q.front();         //队首元素
    for(int i=0;i<8;i++)
    {
    w.x=e.x+f[i][0];
    w.y=e.y+f[i][1];      //往四周寻找能达到的‘1’
    if(w.x>=0&&w.y>=0&&w.x<m&&w.y<n&&a[w.x][w.y]==1)
    {
    Q.push(w);        //每次入队一个,说明找到一个‘1’ 即岛屿面积加1
    L++;
    a[w.x][w.y]=0;
    }
    }
    Q.pop();        //和队首元素直接相连的元素已全部入栈,抛出队首元素
    }
    return L;
    }
    int main()
    {
    int i,j,k=0,sum[505];
    char b; int count=0;
    scanf("%d %d %d",&m,&n,&s);
    getchar();
    for(i=0;i<m;i++)
    {
    for(j=0;j<n;j++)
    {
    scanf("%c",&b);
    if(b==' ')
    j--;
    else
    a[i][j]=b-'0';
    }
    getchar();
    }
    for(i=0;i<m;i++)
    {
    for(j=0;j<n;j++)
    {
    if(a[i][j]==1)
    {
    sum[k]=bfs(i,j);
    count++;
    k++;
    }
    }
    }
    for(i=1;i<k;i++)
    {
    if(sum[i]>sum[0]) sum[0]=sum[i];
    }
    printf("%d %d ",count,sum[0]*s);
    return 0;
    }

    深搜借助的是递归(栈)的思想来解决

    我理解为:只要符合条件就闷着头往里钻,知道最后一个没路了

    回过头看上一步,直到回到第一步  完成遍历。

    而广度优先搜索借助的是队列的思想来解决的

    我理解为:把第一步符合题意的先入队,开始第二步,

    把和队首元素直接相连的元素依次压入队列,然后抛出队首元素,

    重复进行,直到队列为空,遍历结束。

  • 相关阅读:
    什么是webview
    juqery.fn.extend和jquery.extend
    LeetCode
    5. Longest Palindromic Substring
    42. Trapping Rain Water
    11. Container With Most Water
    621. Task Scheduler
    49. Group Anagrams
    739. Daily Temperatures
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/tianxxl/p/6490262.html
Copyright © 2011-2022 走看看