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 }