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

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

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

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

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

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

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

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

  • 相关阅读:
    strpbrk — 在字符串中查找一组字符的任何一个字符
    strip_tags — 从字符串中去除 HTML 和 PHP 标记
    str_word_count — 返回字符串中单词的使用情况
    str_split — 将字符串转换为数组
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
  • 原文地址:https://www.cnblogs.com/tianxxl/p/6490262.html
Copyright © 2011-2022 走看看