UVA 705-Slash Maze
题目大意:由/和\形成迷宫,求有几个回路和最大回路的路长
解题思路:把一个格子扩大俩倍,然后dfs求解
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int map[400][400];
char ch[100][100];
int flag[400][400];
int w, h;
int o1, o2;
int sum, len;
int dir[8][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
void change() {
for(int i = 0; i < h; i++)
for(int j = 0; j < w; j++) {
if(ch[i][j] == '\\') {
map[i*2][j*2] = 1;
map[i*2+1][j*2+1] = 1;
}
else if(ch[i][j] == '/') {
map[i*2+1][j*2] = 2;
map[i*2][j*2+1] = 2;
}
}
w = w * 2;
h = h * 2;
}
void dfs(int a, int b, int l) {
l++;
flag[a][b] = 1;
for(int i = 0; i < 4; i++) {
if(a + dir[i][0] >= 0 && a + dir[i][0] < h && b + dir[i][1] >= 0 && b + dir[i][1] < w) {
int p = a + dir[i][0], q = b + dir[i][1];
if(map[p][q] == 0) {
if(flag[p][q] == 0)
dfs(p, q, l);
else if(p == o1 && q == o2 && l >= 4) {
sum++;
if(l > len)
len = l;
}
}
}
}
for(int i = 4; i < 8; i++) {
if(a + dir[i][0] >= 0 && a + dir[i][0] < h && b + dir[i][1] >= 0 && b + dir[i][1] < w) {
int p = dir[i][0], q = dir[i][1];
int k;
if(p * q == 1)
k = 2;
else if(p * q == -1)
k = 1;
if((map[a+p][b] != k || map[a][b+q] != k) && map[a+p][b+q] == 0) {
if(flag[a+p][b+q] == 0)
dfs(a+p,b+q, l);
else if(a + p == o1 && b + q == o2 && l >= 4) {
sum++;
if(l > len)
len = l;
}
}
}
}
}
int main() {
int n = 0;
while(cin >> w >> h && w + h != 0) {
getchar();
sum = 0;
len = 0;
n++;
for(int i = 0; i < h; i++)
gets(ch[i]);
memset(map, 0, sizeof(map));
memset(flag, 0, sizeof(flag));
change(); // 把h和w也改了
for(int i = 0; i < h; i++)
for(int j = 0; j < w; j++) {
if(flag[i][j] == 0 && map[i][j] == 0) {
o1 = i;
o2 = j;
dfs(i, j, 0);
}
}
printf("Maze #%d:\n", n);
if(sum == 0)
printf("There are no cycles.\n");
else
printf("%d Cycles; the longest has length %d.\n", sum, len);
printf("\n");
}
return 0;
}