Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二维数组C+中的递归问题+;_C++_Recursion - Fatal编程技术网

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

C++ 二维数组C+中的递归问题+;,c++,recursion,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

我有一个问题,从(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;
}
#包括
#定义最大值10
使用名称空间std;
整数数据[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},
};
整数标记[MAX][MAX];
空隙扩展(整数x,整数y,整数v){
如果(x<0 | | x==MAX)返回;
如果(y<0 | | y==MAX)返回;
如果(数据[x][y]==0 | |标记[x][y]!=0)
返回;
数据[x][y]=v;
标记[x][y]=v;
扩展(x+1,y,v);
扩展(x,y+1,v);
扩展(x-1,y,v);
扩展(x,y-1,v);
}
void printArr(int a[MAX][MAX]){
对于(int i=0;icout以下内容可能会解决您的问题:()


1为什么需要递归解决方案?这个可能更好。@Beta听起来有点像课程作业。是的。这是我的课程作业,我最近学习了递归。所以我想用递归解决方案解决它。只是我想提高我的递归编程技能。2分:1)v始终是1,你正在赋值(不在数组中添加)v,因此数组中的值不能超过1(与原始结果不同)。如果v为常量,是否需要它作为参数?;2)我不确定顺序是否必要,但在递增/递减y之前,您总是先递增x直到完成。这是否如预期的那样?再次查看原始结果,我怀疑递增顺序(我的点2)是正确的,因此将v+1传递给spreading()应该没问题,正如Jarod42所回答的,我很感激您的解决方案,但是您能告诉我关于条件的更多细节吗:if(mark[x][y]!=0&&mark[x][y]当我们进行测试时,某些已访问案例的值将高于预期值。当我们稍后访问这些节点时,如果路径较短,我们确实希望更新这些节点,但如果路径较长,我们不希望再传播。
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);
}
(1) 0  ->   1 (2)   -> 1  2  ->  1  2
 0  0       0  0       0 (3)    (4) 3
(1) 2  ->   1  2
 4  3      (2) 3