解题思路:

用递归轻松实现


注意事项:

如果判断的到达递归终点的方式是这样的,一定要把vis数组围起来


参考代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
#define M 200
#define N 200

using namespace std;

int dirRow[] = { 1,0,-1,0 };
int dirCol[] = { 0,1,0,-1 };
int map[M + 2][N + 2];
bool vis[M + 2][N + 2];

void f(int curRow, int curCol, const int m, const int n, int i)
{
    cout << map[curRow][curCol] << " ";
    vis[curRow][curCol] = true;
    
    //如果进入了死胡同,则结束递归
    bool shouldRet = true;
    for (int i = 0; i < sizeof(dirRow) / sizeof(int); i++)
    {
        if (!vis[curRow + dirRow[i]][curCol + dirCol[i]])
        {
            shouldRet = false;
            break;
        }
    }
    if (shouldRet) return;
    
    //试探性地继续向既定方向前进
    int newRow = curRow + dirRow[i % 4], newCol = curCol + dirCol[i % 4];
    //若当前方向上无数可取或已经取过
    if (vis[newRow][newCol] || newRow < 1 || newRow > m || newCol < 1 || newCol > n)
    {
        //转向
        i += 1;
        //模4即可实现循环转向
        newRow = curRow + dirRow[i % 4];
        newCol = curCol + dirCol[i % 4];
    }
    f(newRow, newCol, m, n, i);
}

//把vis数组周围一圈全部围起来,否则会出现输出超限
void surroundVis(int m, int n)
{
    for(int i = 0;i <= m + 1;i++)
        vis[i][0] = vis[i][n+1] = true;
    for(int i = 0;i <= n + 1;i++)
        vis[0][i] = vis[m+1][i] = true;
}

int main()
{
    int m, n;
    cin >> m >> n;
    for (int i = 1; i <= m; i++)
        for (int j = 1; j <= n; j++)
            cin >> map[i][j];
    surroundVis(m, n);;
    f(1, 1, m, n, 0);
    cout << endl;
    return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论