至善之剑 2021-06-27 13:42 采纳率: 0%
浏览 237

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

由一系列的左斜杠(/)和右斜杠(\)组成的围墙将一个由n * m个方格构成的矩形分割成若干个区域。每个区域由若干个三角形构成,如图8-8所示。如果一个人从一个三角形区域经过其相邻的三角形区域一次最后再回到起始出发的三角形,则其走过的所有的三角形区域构成一个回路。设每个三角形区域的长度为1,求迷宫中长度最长的回路的长度。图8*8中最长回路的长度为8。

有代码或者算法思想

  • 写回答

3条回答 默认 最新

  • CSDN专家-link 2021-06-27 13:57
    关注

    没有看到“如图”的图在哪啊

    评论
    至善之剑 2021-06-27 14:08

    我传到回答里面了

    回复
  • brinksli 2023-06-12 03:05
    关注
    
    #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;
    }
    
    

    ```

    展开全部

    评论
  • 至善之剑 2021-06-27 14:06
    关注

    展开全部

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部