二维数组回形遍历(二维数组的回型遍历)

解题思路:

1.两个二维数组,一个用来记录矩阵,另一个用bool型,记录是否访问同时也能形成新的墙壁;

2.分成四个方向,每个方向碰壁后就停止,停止后切换下一个方向;

3.碰壁判断是下一个超出矩阵或者下一个bool数组是墙壁;

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int r, c, arr[100][100] = { 0 };
    bool Arr[100][100] = { true };
    cin >> r >> c;
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)Arr[i][j] = true;
    for (int i = 0; i < r; i++)//输入数据
        for (int j = 0; j < c; j++)cin >> arr[i][j];
    int sumn = 0, d = 1, x = 0, y = 0;//sumn判断是否全部遍历,d控制方向,x.y用来访问
    while (sumn < r c)//当未完全遍历时
    {
        cout << arr[y][x] << endl;
        Arr[y][x] = false;
        //判断碰壁
        if (    (    (x + 1 == c || Arr[y][x + 1] == false) && d == 1)
            /*当右移的时候,要么是到达了整个矩阵的最右边,或者是再右移就碰到了已经访问过的元素了*/ 
            ||  (     (y + 1 == r || Arr[y + 1][x] == false) && d == 2)   ) 
        {
            if (d == 1)d = 2;
            else if (d == 2)d = 3;
        }
        else if (((x == 0 || Arr[y][x - 1] == false) && d == 3) || ((y == 0 || Arr[y - 1][x] == false) && d == 4)) {
            if (d == 3)d = 4;
            else if (d == 4)d = 1;
        }
        //移动
        if (d == 1)x++;//右移
        else if (d == 2)y++;//下移
        else if (d == 3)x--;//左移
        else if (d == 4)y--;//上移
        sumn++;
    }
    return 0;
}

二维数组回形遍历(二维数组的回型遍历)

版权声明:本文内容由互联网用户投稿发布,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2211788188@qq.com 举报,一经查实,本站将立刻删除。如需转载请注明出处:https://www.wptmall.com/a/article/17409

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注