hihoCoder 第253周 hiho一下 矩形分割

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

小Hi有一块由NxM个单位正方形组成的矩形。现在小Ho在某些单位正方形上画了一道分割线,这条分割线或者是单位正方形的主对角线(用‘\‘表示),或者是副对角线(用‘/‘表示)。

现在小Hi想知道这些分割线把NxM的矩形分割成了多少块区域。

例如

/\/

就把2x2的矩形分成了5个区域。

/\/\  /
 \/

把3x4的矩形分成了7个区域。

输入

第一包含两个整数N和M。(1 <= N, M <= 100)

以下N行每行包含M个字符。每个字符只可能是/\或者空格。

输出

分割成的区域数目。

样例输入
3 4
/\/\
\  /
 \/\
样例输出
7

每一个单位正方形都可以被 ‘\‘ 或 ‘/‘ 分割成左右两部分,完全没有访问过用0表示,只访问过左边标记为1,只访问过右边标记2,整个方格都访问过标记3。

dfs 的第三个参数表示从哪个方向进入了方格,同样1表示左边,2表示右边,如果这个方格为 ‘ ‘,则可以传入3。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <vector>
 5
 6
 7 using namespace std;
 8
 9 unsigned char vis[101][101];//0;1 left;2 right;3 all;
10 char mp[101][101];
11 int ans253;
12 int n, m;
13
14 void dfs(int x, int y,unsigned char b)
15 {
16     char c = mp[x][y];
17
18     //vis[x][y] = 3;
19     vis[x][y] |= b;
20     if (c == ‘ ‘)
21         vis[x][y] = 3;
22
23     if (x - 1 >= 0 && (c == ‘ ‘ || (c == ‘\\‘ && b == 2) || (c == ‘/‘ && b == 1)))
24     {
25         if (mp[x - 1][y] == ‘ ‘ && vis[x - 1][y] == 0)
26             dfs(x - 1, y, 3);
27         if (mp[x - 1][y] == ‘\\‘ && (vis[x - 1][y] == 0 || vis[x - 1][y] == 2))
28             dfs(x - 1, y, 1);
29         if (mp[x - 1][y] == ‘/‘ && (vis[x - 1][y] == 0 || vis[x - 1][y] == 1))
30             dfs(x - 1, y, 2);
31     }
32     if (x + 1 < n && (c == ‘ ‘ || (c == ‘\\‘ && b == 1) || (c == ‘/‘ && b == 2)))
33     {
34         if (mp[x + 1][y] == ‘ ‘ && vis[x + 1][y] == 0)
35             dfs(x + 1, y, 3);
36         if (mp[x + 1][y] == ‘\\‘ && (vis[x + 1][y] == 0 || vis[x + 1][y] == 1))
37             dfs(x + 1, y, 2);
38         if (mp[x + 1][y] == ‘/‘ && (vis[x + 1][y] == 0 || vis[x + 1][y] == 2))
39             dfs(x + 1, y, 1);
40     }
41     if (y - 1 >= 0 && (c == ‘ ‘ || b == 1))
42     {
43         if (mp[x][y - 1] == ‘ ‘ && vis[x][y - 1] == 0)
44             dfs(x, y - 1, 3);
45         else if (vis[x][y - 1] == 0 || vis[x][y - 1] == 1)
46             dfs(x, y - 1, 2);
47     }
48     if (y + 1 < m && (c == ‘ ‘ || b == 2))
49     {
50         if (mp[x][y + 1] == ‘ ‘ && vis[x][y + 1] == 0)
51             dfs(x, y + 1, 3);
52         else if (vis[x][y + 1] == 0 || vis[x][y + 1] == 2)
53             dfs(x, y + 1, 1);
54     }
55 }
56
57 int hiho253()
58 {
59     ans253 = 0;
60     scanf("%d %d", &n, &m);
61     char c = getchar();
62     for (int i = 0; i < n; i++)
63     {
64         for (int j = 0; j < m; j++)
65         {
66             c = getchar();
67             mp[i][j] = c;
68         }
69         getchar();
70     }
71     for (int i = 0; i < n; i++)
72     {
73         for (int j = 0; j < m; j++)
74         {
75             if (vis[i][j] == 0 || vis[i][j] == 2)
76             {
77                 ans253++;
78                 dfs(i, j, 1);
79             }
80             if (vis[i][j] == 0 || vis[i][j] == 1)
81             {
82                 ans253++;
83                 dfs(i, j, 2);
84             }
85         }
86     }
87     return ans253;
88 }
89
90 int main()
91 {
92     int ans = hiho253();
93     printf("%d", ans);
94     return 0;
95 }

原文地址:https://www.cnblogs.com/zhangchaosd/p/10817145.html

时间: 2024-10-09 19:07:41

hihoCoder 第253周 hiho一下 矩形分割的相关文章

hihoCoder 第254周 hiho一下 寻找最大值

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 小Ho当然知道怎么做.现在他想把这个问题交给你. 输入 第一行一个数T,表示数据组数.(1 <= T <= 10) 对于每一组数据: 第一行一个整数N(1<=N<=100,000) 第二行N个整数A1, A2, A3, ... AN

hihoCoder 第255周 hiho一下 Queen Attack

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There are N queens in an infinite chessboard. We say two queens may attack each other if they are in the same vertical line, horizontal line or diagonal line even if there are other queens sitting between them.

2017.4.23 1.矩形分割

1.矩形分割 (二分) 1000ms 内存限制:  65536kB 描述 平面上有一个大矩形,其左下角坐标(0,0),右上角坐标(R,R).大矩形内部包含一些小矩形,小矩形都平行于坐标轴且互不重叠.所有矩形的顶点都是整点.要求画一根平行于y轴的直线x=k(k是整数) ,使得这些小矩形落在直线左边的面积必须大于等于落在右边的面积,且两边面积之差最小.并且,要使得大矩形在直线左边的的面积尽可能大.注意:若直线穿过一个小矩形,将会把它切成两个部分,分属左右两侧. 输入 第一行是整数R,表示大矩形的右上

hihocoder第七周 完全背包模板题

时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 等等,这段故事为何似曾相识?这就要从平行宇宙理论说起了………总而言之,在另一个宇宙中,小Ho面临的问题发生了细微的变化! 小Ho现在手上有M张奖券,而奖品区有N种奖品,分别标号为1到N,其中第i种奖品需要need(i)张奖券进行兑换,并且可以兑换无数次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其

[Offer收割]编程练习赛12 题目3 : 矩形分割

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一块由NxM个单位正方形组成的矩形.现在小Ho在某些单位正方形上画了一道分割线,这条分割线或者是单位正方形的主对角线(用'\'表示),或者是副对角线(用'/'表示). 现在小Hi想知道这些分割线把NxM的矩形分割成了多少块区域. 例如 /\/ 就把2x2的矩形分成了5个区域. /\/\ / \/ 把3x4的矩形分成了7个区域. 输入 第一包含两个整数N和M.(1 <= N, M <= 100) 以下N行每行包

hnu12884 Area Coverage 矩形分割 or 线段树

题意:给你n个二维平面上的矩形,可以两两覆盖,问最后覆盖的总面积为多少 解题思路:1)矩形状分割,可以知道,每多出一个矩形就和前面所有产生的矩形判断,看是有相交,如果有的话,就对前面的矩形进行分割,最多可以分割成8块,因为这个算法是n×n的算法时间复杂度,所以我们还需要在枚举的时候加速,采用引导值(下一个不为0的矩阵的值),最后6700ms过了 解题代码: 1 // File Name: rect1.c 2 // Author: darkdream 3 // Created Time: 2014

多个限制的二分题 poj 矩形分割

openoj 矩形分割 总时间限制:  1000ms  内存限制: 65536kB 描述 平面上有一个大矩形,其左下角坐标(0,0),右上角坐标(R,R).大矩形内部包含一些小矩形,小矩形都平行于坐标轴且互不重叠.所有矩形的顶点都是整点.要求画一根平行于y轴的直线x=k(k是整数) ,使得这些小矩形落在直线左边的面积必须大于等于落在右边的面积,且两边面积之差最小.并且,要使得大矩形在直线左边的的面积尽可能大.注意:若直线穿过一个小矩形,将会把它切成两个部分,分属左右两侧. 输入 第一行是整数R,

hihocoder 1330 - 数组重排 - [hiho一下167周][最小公倍数]

题目链接:https://hihocoder.com/problemset/problem/1330 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi想知道,如果他每次都按照一种固定的顺序重排数组,那么最少经过几次重排之后数组会恢复初始的顺序? 具体来讲,给定一个1 - N 的排列 P,小Hi每次重排都是把第 i 个元素放到第 Pi个位置上.例如对于 P = (2, 3, 1),假设初始数组是(1, 2, 3),重排一次之后变为(3, 1, 2),重排两次之后

hihocoder 1331 - 扩展二进制数 - [hiho一下168周]

题目链接:http://hihocoder.com/problemset/problem/1331 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 我们都知道二进制数的每一位可以是0或1.有一天小Hi突发奇想:如果允许使用数字2会发生什么事情?小Hi称其为扩展二进制数,例如(21)ii = 2 * 21 + 1 = 5, (112)ii = 1 * 22 + 1 * 21 + 2 = 8. 很快小Hi意识到在扩展二进制中,每个数的表示方法不是唯一的.例如8还可以有(