用斜线和反斜杠来填写一个矩形,您可以生成漂亮的小迷宫。这里有一个例子:
如上图,可以组成一个迷宫,斜线和反斜杠相当于是迷宫的墙,路径在迷宫中不能分支, 所以整个迷宫只包含循环路径封闭(无法走出迷宫),
还有的路径是通向迷宫外面的。
你的任务是写一个程序, 计算出所形成的迷宫有多少个封闭路径(循环路径),以及计算出其中最长的封闭路径有多长。
代码:
#include<string.h>
#include<stdio.h>
int num = 0, f, sum, pos, h, w, dir[4][2] = {{1, 0},{-1, 0},{0, -1},{0, 1}},map[400][400];
void dfs(int x, int y) {
int i;
for(i=0; i<4; i++) {
int newx = x+dir[i][0];
int newy = y+dir[i][1];
if(newx>=0 && newx<3*h && newy>=0 && newy<=w*3) {
if(map[newx][newy]==0) {
pos++;
map[newx][newy]=1;
dfs(newx, newy);
}
}else {
f=0;
}
}
}
int main() {
int i, j;
char temp[400];
while(scanf("%d%d", &w, &h) &&(w+h)) {
sum=0;
getchar();
memset(map, 0, sizeof(map));
for(i=0; i<h; i++) {
scanf("%s", temp);
for(j=0; j<w; j++) {
if(temp[j]=='\\') {
map[3*i][3*j]=1;
map[3*i+1][3*j+1]=1;
map[3*i+2][3*j+2]=1;
}
else {
map[3*i+2][3*j]=1;
map[3*i+1][3*j+1]=1;
map[3*i][3*j+2]=1;
}
}
}
int maxn = 0;
for(i=0; i<h*3; i++) {
for(j=0; j<3*w; j++) {
if(map[i][j]==0) {
pos=1;
f=1;
map[i][j] = 1;
dfs(i, j);
if(f==1) {
sum++;
if(maxn<pos) {
maxn = pos;
}
}
}
}
}
if (sum==0) printf("Maze #%d:\nThere are no cycles.\n\n",++num);
else printf("Maze #%d:\n%d Cycles; the longest has length %d.\n\n",++num,sum,maxn/3);
}
return 0;
}