思路:从给定坐标开始bfs,将所有联通点标记,然后把每个联通点的四个方向都判断一下,如果这个方向相邻的是一个非联通点说明需要把这条边实在最外围,即周长的一部分。


AC代码

#include <stdio.h>
#include<string.h>
#include <queue>
using namespace std;
const int maxn = 100+5;

int a[maxn][maxn];
bool con[maxn][maxn], vis[maxn][maxn];
int n, m;

struct Pos{
    int x, y;
    Pos(int x, int y):x(x), y(y){
    }
};

const int dx[] = {0,0,1,-1};
const int dy[] = {1,-1,0,0};

bool isVis(int x, int y) {
    if(x < 0 || y < 0 || x >= n || y >= m) return false;
    return true;
}

void bfs(int x, int y) {
    memset(vis, 0, sizeof(vis));
    memset(con, 0, sizeof(con));
    queue<Pos>Q;
    vis[x][y] = true;
    con[x][y] = true;
    Q.push(Pos(x, y));
    while(!Q.empty()) {
        Pos p = Q.front();
        Q.pop();
        int x = p.x, y = p.y;
        for(int i = 0; i < 4; i++) {
            int px = x + dx[i];
            int py = y + dy[i];
            if(!isVis(px, py) || vis[px][py]) continue;
            if(a[x][y] != a[px][py]) {
                vis[px][py] = 1;
                continue;
            }
            vis[px][py] = 1;
            con[px][py] = 1;
            Q.push(Pos(px, py));
        }
    }
}

int solve(int x, int y) {
    bfs(x, y);
    int ans = 0;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            if(con[i][j]) {
                for(int k = 0; k < 4; k++) {
                    int x = i + dx[k];
                    int y = j + dy[k];
                    if(!isVis(x, y) || !con[x][y]) {
                        ans++;
                    }
                }
            }
        }
    }
    return ans;
}

int main() {
    int x, y;
    scanf("%d%d%d%d", &n, &m, &x, &y);
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    printf("%d\n", solve(x, y));
    return 0;
}

如有不当之处欢迎指出!

hihoCoder1319 岛屿周长 (bfs)的更多相关文章

  1. [LeetCode] Island Perimeter 岛屿周长

    You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...

  2. 中矿新生赛 H 璐神看岛屿【BFS/DFS求联通块/连通块区域在边界则此连通块无效】

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 璐神现在有张n*m大小的地图,地图上标明了陆地(用 ...

  3. 463. Island Perimeter岛屿周长

    [抄题]: You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 re ...

  4. 【leetcode】solution in java——Easy2

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6410409.html 6:Reverse String Write a function that takes ...

  5. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  6. [Swift]LeetCode463. 岛屿的周长 | Island Perimeter

    You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...

  7. 力扣(LeetCode)463. 岛屿的周长

    给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相连(对角线方向不相连).整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地 ...

  8. LeetCode 463. Island Perimeter岛屿的周长 (C++)

    题目: You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 repr ...

  9. Leetcode题目200.岛屿数量(BFS+DFS+并查集-中等)

    题目描述: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 ...

随机推荐

  1. scrapy_Response and Request

    scrapy中重要的两个类是什么? Requests.Response 什么是Requests? 网页下载 有哪些参数? url callback headers     # 头部信息 cookie ...

  2. android之间传递list

    Intent intent = new Intent(getActivity(), Activity_Character.class); intent.putExtra("mlTrait&q ...

  3. grep工具及正则表达式

    正则表达式和通配符 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串.vim.grep.awk.sed都支持正 ...

  4. Oracle RAC基本概念

    原文链接:http://tech.it168.com/a2012/0814/1384/000001384756_all.shtml 不同的集群产品都有自己的特点,RAC的特点包括如下几点: ·双机并行 ...

  5. WPF Effect 造成的字体模糊

    WPF 里面有个Effect ,暂且可以理解为 "特效" 分类. 但是有时候使用不恰当,容易出现各种毛病. 例如: 代码如下: <StackPanel HorizontalA ...

  6. Redis 学习(三) —— 事务、消息发布订阅

    一.Redis事务 Redis 提供的事务机制与传统的数据库事务有些不同,传统数据库事务必须维护以下特性:原子性(Atomicity), 一致性(Consistency),隔离性(Isolation) ...

  7. js压缩上传图片

    初学有不当之处,请多多指点, <body> <div class="cc"> <input type="file" id=&quo ...

  8. thinkPHP数据库操作

    thinkPHP如果要对数据库操作,一般来说首先要做的是在配置文件中链接数据库,然后用M方法实例化一张表,然后就是对表的操作了 可以开启调试功能查看程序执行的sql语句: 1.开启调试功能(默认是已经 ...

  9. linux 内核参数优化

    Sysctl命令及linux内核参数调整   一.Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现.   ...

  10. 归并排序Merge Sort

    //C语言实现 void mergeSort(int array[],int first, int last) { if (first < last)//拆分数列中元素只剩下两个的时候,不再拆分 ...