hiho一下159

区域周长

题意:给一个矩阵,数字相同且挨着的视为联通区域,给定x,y,求所在的联通块的周长

思路:Bfs求出联通块的个数,每次搜索的时候判断四周是否是联通的,如果是联通,说明有一条边是重合的,最后联通块的个数*4-重合的边就是答案了(每2个联通的格子之间重合的边回计算2次,但因为重合的2条边都不会计算入周长,所以不用去重才是答案)

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define ll long long
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a) memset(a,0,sizeof(a))
#define mp(x,y) make_pair(x,y)
using namespace std;
const long long INF = 1e18+1LL;
const int inf = 2e9+1e8;
const int N=1e5+100;
const ll mod=1e9+7;

struct Node{
    int xx,yy;
};
int dis[4][2]{{0,1},{0,-1},{-1,0},{1,0}};
int n,m,x,y,ans=1,r,g[105][105];
void Bfs(int x,int y){
    queue<Node> Q;
    while(!Q.empty()) Q.pop();
    int vis[105][105];
    mem(vis);
    Node now,next;
    now.xx=x,now.yy=y;
    Q.push(now);
    vis[x][y]=1;
    while(!Q.empty()){
        now=Q.front();
        Q.pop();
        for(int i=0; i<4; ++i){
            next.xx=now.xx+dis[i][0];
            next.yy=now.yy+dis[i][1];
            if(g[next.xx][next.yy]==g[now.xx][now.yy]){
                r++;
                if(!vis[next.xx][next.yy]){
                    Q.push(next);
                    vis[next.xx][next.yy]=1;
                    ans++;
                }
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    memset(g,-1,sizeof(g));
    cin>>n>>m>>x>>y;
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=m; ++j){
            cin>>g[i][j];
        }
    }
    Bfs(x+1,y+1);
    cout<<ans*4-r<<endl;
    return 0;
}
时间: 2024-11-09 00:04:31

hiho一下159的相关文章

Hiho 1014 题目

hiho一下第二周 Hihocoder #1014 : Trie树 ? 参考链接:http://m.blog.csdn.net/blog/u012662688/38354777 ? Java实现: ? import java.io.BufferedInputStream; import java.util.Scanner; ? ? public class Main { ????public static void main(String[] args) {???????? ????????Sc

欧拉路径 提高篇 hiho第51周

题目链接:hiho 第51周 思路:首先特判n=1的情况,无输出.对于其他的按有向欧拉路径的求法把欧拉路径求出来以后,第一个按位全输出,接下来的的(2^n-1)个点,只需要输出二进制最后一位就可以了.详细的思路参考hiho 第51周 /************************************************************** Problem:hiho 第51周 User: youmi Language: C++ Result: Accepted Time:17m

[hiho 01]最长回文子串、Manacher算法

题目描述 - 基础方法:枚举子串,判断是否为回文串. - 改进:枚举中间位置,向两侧拓展. - 再改进:利用以前的信息,使得不用每个新位置都从长度1开始拓展. - 优化:将字符串预处理为奇数长度以避免考虑条件分支. - 再优化:开头加入特殊字符避免考虑边界. Manacher 算法: id 是中心点,mx 是其边界.P[i] 表示以 i 为中心的最长回文子串的折半长度. 只要 i < mx, 以 i 为中心的回文子串就可以不必从长度1开始找,而从min{P[j], mx - i}开始(其中j为i

hiho一下 第二十一周(线段树 离散化)

知识点1:离散化  对于这些区间来说,其实并不会在乎具体数值是多少,而是在他们的左右端点之间互相进行比较而已.所以你就把这N个区间的左右端点——2N个整数提出来,处理一下呗?你要注意的是,这2N个数是什么其实并不重要,你可以把这2N个数替换成为任何另外2N个数,只要他们之间的相对大小关系不发生改变就可以.” 解决方法: 那么我需要额外做的事情就是在构建线段树之前对区间进行预处理:将区间的左右端点选出来,组成一个集合,然后将这个集合依次对应到正整数集合上,并且利用这个对应将原来的区间的左右端点更换

hiho一下 第115周:网络流一?Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)

来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快.   hiho一下 第115周:网络流一•Ford-Fulkerson算法 原题网址:http://hihocoder.com/contest/hiho115/problem/1 网络流一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和

Fleury算法求欧拉路径 hiho第50周

题目链接: hiho一下 第五十周 思路:hiho已经讲的非常好了,我就不插嘴了. 提示:因为建边时同一条边同相反相的编号相近,比如(u-v)正向边u->v标号为0,反向边v->u标号为1,而0或1除以2都等于0,所以无论正反向建边,只要访问过正向反向中的任何一条边都可以用head[u]/2把原边标记为vis=1操作 /************************************************************** Problem:hiho 50 User: you

欧拉路径 基础题 hiho第49周

题目链接:hiho 第49周 思路: 定义:给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 性质:  1: 一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点.  2: 若图中没有奇数度的点,那么起点和终点一定是同一个点,这样的欧拉路叫做欧拉回路 利用性质做题就好了,具体的模拟hiho讲的非常清楚了 /****************************************************

hiho一下 第二十四周---最短路径&#183;二:Floyd算法

最短路径·二:Floyd算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 由于没有肚子的压迫,小Hi和小Ho决定好好的逛一逛这个鬼屋,逛着逛着,小Hi产生了这样的问题:鬼屋中任意两个地点之间的最短路径是多少呢? 提示:其实如果你开心的话,完全可以从

圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point

1 // 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point 2 // 思路:直接暴力绝对T 3 // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再比较y 4 // O(n) 5 6 #include <bits/stdc++.h> 7 using namespace std; 8 #define LL long long 9 const double inf = 123456789012345.0; 10 const LL MO