这一题是一道搜索题。和以前做过的最大黑区域有着很大的相似之处。
都是利用递归进行搜索。
但是最大的不同就是,粉刷迷宫由于要先求出可以和外界相通的迷宫。
所以必须从最外围进行搜索,然后标记出可以和外界相通的路。
最后对内部需要粉刷的墙壁和外部需要粉刷的墙壁进行统计。
最后得出的结果就是总共需要粉刷的墙壁了。
其实这题还可以用栈来做。
算法思想见严蔚敏的数据结构的栈那一章。最后提到的迷宫求解。
如果从某个点出发,无法找到出口,那么这个点就是被墙壁围住的点。
但是这样需要对每个点进行扫描,效率没有第一种的高,而且复杂性也增强了。
下面是代码。
#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; }