由一系列的左斜杠(/)和右斜杠(\)组成的围墙将一个由n * m个方格构成的矩形分割成

由一系列的左斜杠(/)和右斜杠(\)组成的围墙将一个由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;
}

```