URAL/1033 迷宫
2017-05-01 10:42
477 查看
题面:
迷宫的管理员们决定在新开始的季节里使用新的墙纸。出于这个目的他们需要一个程序来计算迷宫内墙壁的面积。这就是你即将要做的工作。
我们把这个迷宫用一个 N*N (3 <= N <= 33) 的矩阵表示。一些矩阵单元包含一个 “ .”
(这代表一个空的方块),另一些矩阵单元包含一个“ #” (这代表一个用巨石砌成的石墙
占据的方块)。全部方块的大小都为 3*3 平方米。
墙壁由迷宫的四周(除了作为迷宫出入口的左上角和右下角以外)以及那些标记为
“ #” 的矩阵单元构成,除此之外没有其他的墙。在输入的矩阵里左上角和右下角永远是
一个“ .” 。 你的任务是计算迷宫里可见部分的墙壁的面积。换句话说,就是对迷宫的游
客来说墙壁表面可见的部分。注意在两块相邻的石块之间没有空隙,即使两块石块在转角处
相接触,我们都认为它们是相邻的。看看图示的例子:迷宫中可见的墙壁都用加粗的线条来描画。所有墙壁的高度都是三米。
Input
输入的第一行包含一个数字 N。接下来的 N 行每行都包含有 N 个字符。每行描述了迷宫
矩阵的一行。每行都只有“ .” 、 “ #” 这两个字符并都以一个换行符结束。输入里没有
任何的空格
Output
你的程序必须输出一个整数,即所需要的壁纸的准确面积。
Sample Input
5
…..
…##
..#..
..###
…..
Sample Output
198
大致思路:
分别从左上角和右下角进行DFS,每遇到一个未到过的地方,判断其上下左右是否有墙壁。然后最后的结果减去4(因为出入口应该没有墙壁)代码:
#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<cstdio> using namespace std; const int maxn=40; typedef struct{ int x,y; }Node; char mp[maxn][maxn]; bool visit[maxn][maxn]; int n,ans=0; int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; void dfs(int x,int y) { if(x<1||y<1||x>n||y>n) return; if(!visit[x][y]) return ; visit[x][y]=false; for(int i=0;i<4;++i){ int dx=x+dis[i][0]; int dy=y+dis[i][1]; if(mp[dx][dy]=='#') ans++; else dfs(dx,dy); } } int main() { //freopen("in.txt","r",stdin); memset(mp,'#',sizeof(mp)); memset(visit,false,sizeof(visit)); cin>>n; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ cin>>mp[i][j]; if(mp[i][j]=='.') visit[i][j]=true; } dfs(1,1); dfs(n,n); cout<<(ans-4)*9<<endl; return 0; }
相关文章推荐
- 【Ural 1033】 Labyrinth.(迷宫)
- Ural1033 FloodFill 算法
- URAL 1033 Labyrinth (DFS)
- ural 1033. Labyrinth(dfs)
- URAL 1033 Labyrinth
- URAL 1033 Labyrinth
- ural 1033 Labyrinth
- Ural 1033
- URAL 1033|Labyrinth|搜索
- Labyrinth (URAL 1033)
- Ural 1033 Labyrinth(bfs)
- 【BFS】ural 1033
- ural 1033. Labyrinth(dfs)
- URAL 1389 Roadworks 贪心
- URAL 1297 后缀数组+线段树
- HDU1272 小希的迷宫
- URAL - 2102 Michael and Cryptography 分解质因数+优化
- URAL 1747 Kingdom Inspection 容斥原理
- 最强大脑的蜂巢迷宫 创意源于此
- HDU 1272 小希的迷宫