hihocoder offer收割编程练习赛8 B

思路:

模拟,dfs。

注意题目中的trick,输出一块的时候不要把其他块也输出了。

实现:

 1 #include <cstring>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 char a[505][505];
 8 int n, m, minx, miny, maxx, maxy;
 9 bool vis[505][505], ok[505][505];
10 int dx[4] = { 0, 1, 0, -1 };
11 int dy[4] = { 1, 0, -1, 0 };
12
13 void dfs(int x, int y)
14 {
15     ok[x][y] = vis[x][y] = true;
16     minx = min(x, minx);
17     miny = min(y, miny);
18     maxx = max(x, maxx);
19     maxy = max(y, maxy);
20     for (int i = 0; i < 4; i++)
21     {
22         int nx = x + dx[i];
23         int ny = y + dy[i];
24         if (nx >= 0 && nx < n && ny >= 0 && ny < m && !vis[nx][ny] && a[nx][ny] == ‘1‘)
25         {
26             dfs(nx, ny);
27         }
28     }
29 }
30 int main()
31 {
32     cin >> n >> m;
33     for (int i = 0; i < n; i++)
34     {
35         for (int j = 0; j < m; j++)
36         {
37             cin >> a[i][j];
38         }
39     }
40     for (int j = 0; j < m; j++)
41     {
42         for (int i = 0; i < n; i++)
43         {
44             if (!vis[i][j] && a[i][j] == ‘1‘)
45             {
46                 minx = maxx = i, miny = maxy = j;
47                 memset(ok, 0, sizeof(ok));
48                 dfs(i, j);
49                 cout << maxx - minx + 1 << " " << maxy - miny + 1 << endl;
50                 for (int j = minx; j <= maxx; j++)
51                 {
52                     for (int k = miny; k <= maxy; k++)
53                     {
54                         cout << ok[j][k];
55                     }
56                     cout << endl;
57                 }
58             }
59         }
60     }
61     return 0;
62 }
时间: 2024-08-10 21:29:55

hihocoder offer收割编程练习赛8 B的相关文章

hihocoder - [Offer收割]编程练习赛17

hihocoder - [Offer收割]编程练习赛17 题目1 : F1 Score 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和他的小伙伴们一起写了很多代码.时间一久有些代码究竟是不是自己写的,小Hi也分辨不出来了. 于是他实现了一个分类算法,希望用机器学习实现自动分类. 为了评价这个分类算法的优劣,他选出了N份有标记的代码作测试集,并决定用F1 Score作为评价标准. 给出N份代码的实际作者是不是小Hi以及分类算法预测的结果,请你计算F1 Sco

hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x值是多少.这里还要再辅助一个val[k]表示处理到当前情况只错了k次的最小值是多少因为改变的不止是和弦还有初始值,可以看一下代码理解一下. #include <iostream> #include <cstring> #include <cstdio> #include &

hihoCoder [Offer收割]编程练习赛3 D子矩阵求和

子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常规的定义) 性质好题 看起来无从下手. 两个关键性质: 证明挺显然的.画画图 同余方程exgcd即可 子矩阵和? 先算出(0,0)的,每次平移,加减一行一列前n或m个, 细节: 1.纵向要循环到n,横向循环到m 2.注意开long long 3.反常规的设定真讨厌 #include<bits/std

hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物

题目1 : 小Hi和小Ho的礼物 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 某人有N袋金币,其中第i袋内金币的数量是Ai.现在他决定选出2袋金币送给小Hi,再选2袋金币送给小Ho,同时使得小Hi和小Ho得到的金币总数相等.他想知道一共有多少种不同的选择方法. 具体来说,有多少种下标四元组(i, j, p, q)满足i, j, p, q两两不同,并且i < j, p < q, Ai + Aj = Ap + Aq. 例如对于数组A=[1, 1, 2, 2, 2]

hihocoder [Offer收割]编程练习赛14 投掷硬币

题目2 : 投掷硬币 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一枚神奇的硬币.已知第i次投掷这枚硬币时,正面向上的概率是Pi. 现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少. 输入 第一行包含两个整数N和M. 第二行包含N个实数P1, P2, ... PN. 对于30%的数据,1 <= N <= 20 对于100%的数据,1 <= N <= 1000, 0 <= M <= N, 0 <= Pi &

hihocoder [Offer收割]编程练习赛14 可疑的记录

题目3 : 可疑的记录 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一棵N个节点的树,编号1-N,其中1号节点是整棵树的根.他把这棵树的N-1条边记录成N-1行,每行2个整数a和b,表示a是b的父节点. 喜欢恶作剧的小Ho在小Hi的记录里加了一行两个整数,于是小Hi不得设法找出这行可疑的记录.具体来说,如果去掉某一行之后,余下N-1行按小Hi的规则(a是b的父节点)恰好能构成一棵N个节点的树,并且满足编号恰好是1-N且1号节点是根,那么被去掉的一行就被视

hihocoder [Offer收割]编程练习赛14 剑刃风暴

题目4 : 剑刃风暴 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 主宰尤涅若拥有一招非常厉害的招式——剑刃风暴,“无论是战士还是法师,都害怕尤涅若的武士刀剑技”. 现在战场上有N名敌对英雄,他们的位置分别为(Xi, Yi),而剑刃风暴的伤害范围是一个半径为R的圆形,尤涅若可以选择一个坐标作为剑刃风暴的中心,所有处于这个圆形范围内的英雄都会受到剑刃风暴的伤害. 现在尤涅若想要知道,他的剑刃风暴最多可以同时伤害到多少敌对英雄. 输入 第一行为两个整数N和R,分别敌对

hihocoder offer收割编程练习赛13 D 骑士游历

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const ll mod = 1e9 + 7; 11 12 ll n, x, y;

hihocoder [Offer收割]编程练习赛4

描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望选择若干道不同的菜品,使得总价在不低于X元的同时尽量低. 你能算出这一餐小Ho最少消费多少元吗? 输入 第一行包含两个整数N和X,(1 <= N <= 20, 1 <= X <= 100) 第二行包含N个整数A1, A2, ..., AN.(1 <= Ai <= 100)

hihocoder offer收割编程练习赛12 C 矩形分割

思路: 模拟,深搜. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 using namespace std; 5 6 const int dx[4] = { 0, 1, 0, -1 }; 7 const int dy[4] = { -1, 0, 1, 0 }; 8 9 int n, m, cnt = 0; 10 int a[305][305]; 11 bool vis[305][3