简体   繁体   English

二维数组C ++中的递归问题

[英]Recursive problems in 2D array C++

I have a problem that from a certain number 1 in a 2D matrix with (x, y) coordinates. 我有一个问题,即从(x,y)坐标的2D矩阵中的某个数字1开始。 From this number, it will start spreading out its 4-neighbor which their values will be assigned by (start point + 1) 从这个数字开始,它将开始扩展其4邻居,它们的值将由(起点+ 1)分配

We start from a coordinate of (3, 3) = 1. Its neighbor's value will be 2. Next step, 4 neighbors of the point having value of 2 will be 3. And so on, until, all 1 numbers in the matrix are infected! 我们从(3,3)= 1的坐标开始。其邻居的值为2。下一步,值为2的点的4个邻居为3。依此类推,直到矩阵中的所有1个数字均为感染了!

I have resolved this problem by using some loops. 我已经通过使用一些循环解决了这个问题。 However, I'd like to resolve it by another way that is recursion. 但是,我想通过另一种方式来解决它,即递归。 But I haven't done with it. 但是我还没有完成。

Before 之前

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 1 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 1 1 1 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

After spreading out 摊开后

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 3 2 3 0 0 0 0 0
0 0 2 1 2 3 4 5 0 0
0 0 3 2 3 4 0 0 0 0
0 0 0 0 4 5 0 0 0 0
0 0 0 0 5 6 0 0 0 0
0 0 8 7 6 0 0 0 0 0
0 0 9 8 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Below is my code but I just can spread all 1 numbers with another value but not as I want. 下面是我的代码,但我只能将所有1个数字与另一个值一起传播,但不如我所愿。 So please help me resolve this problem. 因此,请帮助我解决此问题。

#include <iostream>
#define MAX 10

using namespace std;

int data[MAX][MAX] = {
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
    {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
    {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
    {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
    {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
    {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};

int mark[MAX][MAX];


void spreading(int x, int y, int v){
    if (x < 0 || x == MAX) return;
    if (y < 0 || y == MAX) return;

    if(data[x][y] == 0 || mark[x][y] != 0)
        return;
    data[x][y] = v;
    mark[x][y] = v;

    spreading(x + 1, y, v);
    spreading(x, y + 1, v);
    spreading(x - 1, y, v);
    spreading(x, y - 1, v);
}

void printArr(int a[MAX][MAX]){

    for (int i = 0; i < MAX; ++i) {
        cout << endl;
        for (int j = 0; j < MAX; ++j) {
            cout << a[i][j] << " ";
        }
    }
}

int main(){

    spreading(3, 3, 1);
    printArr(data);
    system("pause");
    return 0;
}

Following may solve your issue: ( https://ideone.com/VQmBhU ) 以下可能会解决您的问题:( https://ideone.com/VQmBhU

void spreading(int x, int y, int v){
    // Test if x, y is inside the propagation area
    if (x < 0 || x == MAX) return;
    if (y < 0 || y == MAX) return;
    if (data[x][y] == 0) return;

    // if already visited with a better path, cancel.
    // if not visited, or the previous visit was worst than this try, continue
    if (mark[x][y] != 0 && mark[x][y] <= v) return;

    data[x][y] = v;
    mark[x][y] = v;

    spreading(x + 1, y, v + 1);
    spreading(x, y + 1, v + 1);
    spreading(x - 1, y, v + 1);
    spreading(x, y - 1, v + 1);
}

Some example of 're' visit (with the mark array content): “重新”访问的一些示例(带有mark数组的内容):

(1) 0  ->   1 (2)   -> 1  2  ->  1  2
 0  0       0  0       0 (3)    (4) 3

1 <= 5 , 3 <= 5 : (4) finished 1 <= 5 3 <= 5 :(4)完成
2 <= 4 : (3) finished 2 <= 4 :(3)完成
1 <= 3 : (2) finished 1 <= 3 :(2)完成
4 > 2 : we continue propagation from (1) 4 > 2 :我们继续从(1)传播

(1) 2  ->   1  2
 4  3      (2) 3

... ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM