2815:城堡问题 输入处理,连通块

http://bailian.openjudge.cn/practice/2815?lang=en_US

题意:给你一个地图(二进制处理) 问有几个连通块,与最大连通块的面积。

题解:处理输入时,用四个if位运算判断。连通块模板处理。

#define _CRT_SECURE_NO_WARNINGS
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<string>
#include<stack>
#include<ctime>
#include<list>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<sstream>
#include<iostream>
#include<functional>
#include<algorithm>
#include<memory.h>
//#define INF 0x3f3f3f3f
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
#define rep(i,t,n)  for(int i =(t);i<=(n);++i)
#define per(i,n,t)  for(int i =(n);i>=(t);--i)
#define mp make_pair
#define pb push_back
#define mmm(a,b) memset(a,b,sizeof(a))
//std::ios::sync_with_stdio(false);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
void smain();
#define ONLINE_JUDGE
int main() {
    ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    long _begin_time = clock();
#endif
    smain();
#ifndef ONLINE_JUDGE
    long _end_time = clock();
    printf("time = %ld ms.", _end_time - _begin_time);
#endif
    return 0;
}
const int maxn = 1e4 + 100;
const ll mod = 1e5 + 7;
const ll INF = (100000)*(200000ll) + 1000;

int n, m;
int rooms[55][55];
int color[55][55];
int roomNum, mx;
int area;
void dfs(int i,int k) {
    if (color[i][k])return;
    area++;
    color[i][k] = roomNum;
    int x = rooms[i][k];

    if ((x&1) == 0)dfs(i, k - 1);

    if ((x & 2) == 0)dfs(i-1, k);

    if ((x & 4) == 0)dfs(i, k + 1);

    if ((x & 8)==0)dfs(i+1, k);

}
void Run() {

}

void smain() {
    cin >> n >> m;
    rep(i,1,n)
        rep(j, 1, m) {
        cin>> rooms[i][j];
}
    mmm(color, 0);
    rep(i, 1, n)
        rep(j, 1, m) {
        if (!color[i][j]) {
            roomNum++;
            area = 0;
            dfs(i, j);
            mx = max(area, mx);
        }
    }
    cout << roomNum << endl;
    cout << mx << endl;
}

原文地址:https://www.cnblogs.com/SuuT/p/8973344.html

时间: 2024-08-07 19:30:48

2815:城堡问题 输入处理,连通块的相关文章

nyoj27-水池数目 (求连通块数目)【dfs】

http://acm.nyist.net/JudgeOnline/problem.php?pid=27 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0

广搜——连通块

Wikioi 3410 别墅房间 题目描述 Description 小浣熊松松到他的朋友家别墅去玩,发现他朋友的家非常大,而且布局很奇怪.具体来说,朋友家的别墅可以被看做一个N*M的矩形,有墙壁的地方被标记为’#’,其他地方被标记为’.’.两个格子(a,b)和(c,d)被当做在同一个房间内,当且仅当|a-c|+|b-d|=1.现在松松想知道,有多少个房间. 输入描述 Input Description 第一行包含两个整数,N和M. 接下来N行描述别墅的情况,只包含’*’和’.’. 输出描述 Ou

UVA 572 Oil Deposits油田(DFS求连通块)

UVA 572     DFS(floodfill)  用DFS求连通块 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M

DFS入门之二---DFS求连通块

用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所在位置相邻(上下左右对角共八个方位),则在一个连通块.典型例题:HDU 1241 Oil Deposits 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目描述:输入m行n列的字符矩阵, 统计字符“@”组成八连块的个数. 题意分析:读入数据

求图的连通块

求连通块 Time Limit: 1sec    Memory Limit:256MB Description 输入一个简单无向图,求出图中连通块的数目. Input 输入的第一行包含两个整数n和m,n是图的顶点数,m是边数.1<=n<=100,0<=m<=10000. 以下m行,每行是一个数对u v,表示存在边(u,v).顶点编号从1开始. Output 单独一行输出连通块的数目. Sample Input 5 3 1 2 1 3 2 4 Sample Output 2 这个题目

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

时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 璐神现在有张n*m大小的地图,地图上标明了陆地(用"#"表示)和海洋(用"."表示),现在璐神要计算这张地图上岛屿的数量. 已知岛屿是由陆地的连通块组成,即一块陆地的上.下.左.右,左上,右上,左下,右下有其他陆地,则构成连通块,以此类推. 此外,岛屿的详细定义如下: 1.岛屿的周围必须全是海洋. 2.如果连通块有任意

油田(Oil Deposits)-用DFS求连通块

[本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个m行n列的字符矩阵,统计字符"@"组成多少个八连块.如果两个字符"@"所在的格子相邻(横.纵或者对角线方向),就说它们属于一个八连块.例如,下图中有两个八连块. 一.分析 1.1 整体思路 图也有DFS和BFS遍历.由于DFS更容易编写,一般用DFS查找连通块:从每个&

用DFS求连通块(种子填充)

[问题] 输入一个m行n列的字符矩阵,统计字符"@"组成多少个八连块.如果两个字符"@"所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分析] 和前面的二叉树遍历类似,图也有DFS和BFS遍历.由于DFS更容易编写,一般用DFS找连通块:从每个"@"格子出发,递归遍历它周围的"@"格子.每次访问一个格子时就给它写上一个"连通分量编号"(即下面代码

P1141 01迷宫(连通块模板)

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入格式 第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式 m行,对于每个询问输