Time Limit: 1000 ms Memory Limit: 50 MB
Total Submission: 21 Submission Accepted: 11
Judge By Case
Description
迷宫的管理员们决定在新开始的季节里使用新的墙纸。出于这个目的他们需要一个程序
来计算迷宫内墙壁的面积。这就是你即将要做的工作。
我们把这个迷宫用一个 N*N (3 <= N <= 33) 的矩阵表示。一些矩阵单元包含一个 “ .”
(这代表一个空的方块),另一些矩阵单元包含一个“ #” (这代表一个用巨石砌成的石墙
占据的方块)。全部方块的大小都为 3*3 平方米。
墙壁由迷宫的四周(除了作为迷宫出入口的左上角和右下角以外)以及那些标记为
“ #” 的矩阵单元构成,除此之外没有其他的墙。在输入的矩阵里左上角和右下角永远是
一个“ .” 。 你的任务是计算迷宫里可见部分的墙壁的面积。换句话说,就是对迷宫的游
客来说墙壁表面可见的部分。注意在两块相邻的石块之间没有空隙,即使两块石块在转角处
相接触,我们都认为它们是相邻的。看看图示的例子:迷宫中可见的墙壁都用加粗的线条来
描画。所有墙壁的高度都是三米。
来计算迷宫内墙壁的面积。这就是你即将要做的工作。
我们把这个迷宫用一个 N*N (3 <= N <= 33) 的矩阵表示。一些矩阵单元包含一个 “ .”
(这代表一个空的方块),另一些矩阵单元包含一个“ #” (这代表一个用巨石砌成的石墙
占据的方块)。全部方块的大小都为 3*3 平方米。
![](http://i1.piimg.com/591644/67cd09ef7ccfbc10.png)
墙壁由迷宫的四周(除了作为迷宫出入口的左上角和右下角以外)以及那些标记为
“ #” 的矩阵单元构成,除此之外没有其他的墙。在输入的矩阵里左上角和右下角永远是
一个“ .” 。 你的任务是计算迷宫里可见部分的墙壁的面积。换句话说,就是对迷宫的游
客来说墙壁表面可见的部分。注意在两块相邻的石块之间没有空隙,即使两块石块在转角处
相接触,我们都认为它们是相邻的。看看图示的例子:迷宫中可见的墙壁都用加粗的线条来
描画。所有墙壁的高度都是三米。
Input
输入的第一行包含一个数字 N。接下来的 N 行每行都包含有 N 个字符。每行描述了迷宫
矩阵的一行。每行都只有“ .” 、 “ #” 这两个字符并都以一个换行符结束。输入里没有
任何的空格
矩阵的一行。每行都只有“ .” 、 “ #” 这两个字符并都以一个换行符结束。输入里没有
任何的空格
Output
你的程序必须输出一个整数,即所需要的壁纸的准确面积。
Sample Input
Original | Transformed |
5 ..... ...## ..#.. ..### .....
5[EOL] .....[EOL] ...##[EOL] ..#..[EOL] ..###[EOL] .....[EOF]
Sample Output
Original | Transformed |
198
这题考虑可能起点和终点不通,所以要两次dfs
#include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> //#define DEBUG const int maxn =50; using namespace std; int G[maxn][maxn]; int n, ans; int dir[][2] = { {1,0},{0,1},{-1,0},{0,-1} }; char s[maxn]; void dfs(int x, int y); bool check(int x, int y); int main() { #ifdef DEBUG freopen("Text.txt", "r", stdin); #endif // DEBUG while (scanf("%d",&n)!=EOF) { memset(G, 0, sizeof(G)); ans = 0; int i, j; for (i = 1; i <= n; i++) { scanf("%s", s + 1); for (j = 1; j <= n; j++) { if (s[j] == '.') G[i][j] = 1; } } /*for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { cout << G[i][j]; } cout << endl; }*/ dfs(1, 1); dfs(n, n); for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (G[i][j] == 2) { for (int k = 0; k < 4; k++) { int xx = i + dir[k][0]; int yy = j + dir[k][1]; if (G[xx][yy]==0) ans++; } } } } printf("%d\n", (ans-4)*9); } return 0; } void dfs(int x, int y) { if (!check(x, y)) return; printf("x = %d y = %d\n", x, y); G[x][y] = 2; dfs(x - 1, y); dfs(x + 1, y); dfs(x, y - 1); dfs(x, y + 1); } bool check(int x, int y) { if (x > 0 && x <= n&&y > 0 && y <= n&&G[x][y]==1) return true; return false; }