FJNU OJ 2072粉刷迷宫。

这一题是一道搜索题。和以前做过的最大黑区域有着很大的相似之处。

都是利用递归进行搜索。

但是最大的不同就是,粉刷迷宫由于要先求出可以和外界相通的迷宫。

所以必须从最外围进行搜索,然后标记出可以和外界相通的路。

最后对内部需要粉刷的墙壁和外部需要粉刷的墙壁进行统计。

最后得出的结果就是总共需要粉刷的墙壁了。

 

其实这题还可以用栈来做。

算法思想见严蔚敏的数据结构的栈那一章。最后提到的迷宫求解。

如果从某个点出发,无法找到出口,那么这个点就是被墙壁围住的点。

但是这样需要对每个点进行扫描,效率没有第一种的高,而且复杂性也增强了。

 

下面是代码。

 

#include <stdio.h> #include <string.h> #define X 60 #define Y 60 void DeepSearch(int migong[][Y+2], int x, int y) { migong[x][y] = -1; if (migong[x][y+1] == 1) DeepSearch(migong, x, y+1); if (migong[x+1][y] == 1) DeepSearch(migong, x+1, y); if (migong[x][y-1] == 1) DeepSearch(migong, x, y-1); if (migong[x-1][y] == 1) DeepSearch(migong, x-1, y); } int main() { //从最外围开始搜索 int migong[X+2][Y+2]; int i,j; int x,y; char c; int per_count; int inside_count; char line[60]; while (scanf("%d%d", &x,&y)!=EOF) { memset(migong, 0, sizeof(migong)); for (i=1;i<=x;i++) { scanf("%s", line); for (j=0;j<y;j++) { switch (line[j]) { case '#': migong[i][j+1] = 2; break; case '.': migong[i][j+1] = 1; break; } } } //标记能与外界相通的路 for (i=1;i<=x;i++) { if (migong[i][1] == 1) DeepSearch(migong, i, 1); if (migong[i][y] == 1) DeepSearch(migong, i, y); } for (i=1;i<=y;i++) { if (migong[1][i] == 1) DeepSearch(migong, 1, i); if (migong[x][i] == 1) DeepSearch(migong, x, i); } //统计内部的边数 inside_count = 0; for (i=1;i<=x;i++) { for (j=1;j<=y;j++) { if (migong[i][j] == -1) { if (migong[i][j+1] == 2) inside_count++; if (migong[i][j-1] == 2) inside_count++; if (migong[i+1][j] == 2) inside_count++; if (migong[i-1][j] == 2) inside_count++; } } } //最后对外围一圈进行统计 per_count = 0; for (i=1;i<=x;i++) { if (migong[i][1] == 2) per_count++; if (migong[i][y] == 2) per_count++; } for (i=1;i<=y;i++) { if (migong[1][i] == 2) per_count++; if (migong[x][i] == 2) per_count++; } printf("%d/n", inside_count+per_count); } return 0; }

你可能感兴趣的:(数据结构,算法)