hihoCoder 第253周 hiho一下 矩形分割

Posted zhangchaosd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于hihoCoder 第253周 hiho一下 矩形分割的主要内容,如果未能解决你的问题,请参考以下文章

hihocoder 1334 - Word Construction - [hiho一下第170周][状态压缩+DFS]

hiho一下第134周 1468 : 2-SAT·hihoCoder新春晚会

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

hiho一下第133周 2-SAT·hihoCoder音乐节(2-SAT)(强连通)

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

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