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

时间:2014-02-24 13:56:25

标签: c++ recursion

我有一个问题,即在具有(x,y)坐标的2D矩阵中从某个数字1开始。从这个数字开始,它将开始展开它的4个邻居,它们的值将被分配(起点+ 1)

我们从(3,3)= 1的坐标开始。它的邻居的值将是2.下一步,值为2的点的4个邻居将是3.依此类推,直到,所有1个数字在矩阵被感染了!

我通过使用一些循环解决了这个问题。但是,我想通过另一种递归方式来解决它。但我还没有完成它。

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

分散后

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

下面是我的代码,但我可以用另一个值传播所有1个数字,但不是我想要的。所以请帮我解决这个问题。

#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;
}

1 个答案:

答案 0 :(得分:2)

以下内容可能会解决您的问题:(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);
}

“重新”访问的一些示例(使用mark数组内容):

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

1 <= 53 <= 5 :( 4)完成了 2 <= 4 :( 3)完成了 1 <= 3 :( 2)完成了 4 > 2:我们继续从(1)

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

...