由一系列的左斜杠(/)和右斜杠(\)组成的围墙将一个由n * m个方格构成的矩形分割成若干个区域。每个区域由若干个三角形构成,如图8-8所示。如果一个人从一个三角形区域经过其相邻的三角形区域一次最后再回到起始出发的三角形,则其走过的所有的三角形区域构成一个回路。设每个三角形区域的长度为1,求迷宫中长度最长的回路的长度。图8*8中最长回路的长度为8。
有代码或者算法思想
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
char** maze;
int width,length;
struct route {
int i, j, MAX;
};
int M=0;
queue<route>qu;
void cal(int i, int j) {
if (j + 1 < length) {
if (maze[i][j + 1] == '\\') {
if (j - 1 >= 0 && maze[i][j - 1] != '1') {
qu.push(route{ i,j - 1,qu.back().MAX + 1 });
maze[i][j - 1] = '1';
}
else if (i + 1 < width) {
if (maze[i + 1][j + 2] == '0' && maze[i + 1][j + 1] == '\\') {
qu.push(route{ i + 1,j + 2 ,qu.back().MAX + 1 });
maze[i + 1][j + 2] = '1';
}
else if(maze[i + 1][j] != '1') {
qu.push(route{ i + 1,j ,qu.back().MAX + 1 });
maze[i + 1][j] = '1';
}
}
}
else if (maze[i][j + 1] == '/') {
if (j - 1 >= 0 && maze[i][j - 1] != '1') {
qu.push(route{ i,j - 1,qu.back().MAX + 1 });
maze[i][j - 1] = '1';
}
else if (i - 1 >= 0) {
if (maze[i - 1][j + 2] == '0' && maze[i - 1][j + 1] == '/') {
qu.push(route{ i - 1,j + 2 ,qu.back().MAX + 1 });
maze[i - 1][j + 2] = '1';
}
else if( maze[i - 1][j] != '1') {
qu.push(route{ i - 1,j ,qu.back().MAX + 1 });
maze[i - 1][j] = '1';
}
}
}
}
if (j - 1 >= 0) {
if (maze[i][j - 1] == '\\') {
if (j + 1 < length && maze[i][j + 1] != '1') {
qu.push(route{ i,j + 1,qu.back().MAX + 1 });
maze[i][j + 1] = '1';
}
else if (i - 1 >= 0) {
if (maze[i - 1][j - 2] == '0' && maze[i - 1][j - 1] == '\\') {
qu.push(route{ i - 1,j - 2,qu.back().MAX + 1 });
maze[i - 1][j - 2] = '1';
}
else if (maze[i - 1][j] != '1') {
qu.push(route{ i - 1,j,qu.back().MAX + 1 });
maze[i - 1][j] = '1';
}
}
}
else if (maze[i][j - 1] == '/') {
if (j + 1 < length && maze[i][j + 1] != '1') {
qu.push(route{ i,j + 1,qu.back().MAX + 1 });
maze[i][j + 1] = '1';
}
else if (i + 1 < width) {
if ( maze[i + 1][j - 2] == '0' && maze[i + 1][j - 1] == '/') {
qu.push(route{ i + 1,j - 2 ,qu.back().MAX + 1 });
maze[i + 1][j-2] = '1';
}
else if(maze[i + 1][j] != '1') {
qu.push(route{ i + 1,j ,qu.back().MAX + 1 });
maze[i + 1][j] = '1';
}
}
}
}
}
void maxRound() {
int i, j,k;
for (i = 0;i < width;++i) {
for (j = 0;j < length;++j)
switch (maze[i][j]) {
case '0':
qu.push(route{ i,j,0 });
maze[i][j] = '1';
k = 0;
while (!qu.empty()) {
cal(qu.front().i, qu.front().j);
if (qu.back().i == i && qu.back().j == j) {
M = M < qu.back().MAX ? qu.back().MAX : M;
while (qu.size()>0){qu.pop();}
break;
}
qu.pop();
++k;
if (k == 2)maze[i][j] = '0';
}
break;
case '\\':
case '/':
case '1':break;
default:
break;
}
}
}
int main() {
int i, j;
cin >> width >> length;
length *= 3;
maze = new char* [width];
for (i = 0;i < width;++i) {
maze[i] = new char[length];
memset(maze[i], '0', sizeof(char) * length);
}
for (i = 0;i < width;++i)
for (j = 1;j < length;j += 3)
cin >> maze[i][j];
maxRound();
cout << M;
for (i = 0;i < width;++i)
delete[]maze[i];
delete[]maze;
return 0;
}
```