C++ 如何处理递归?

C++ 如何处理递归?,c++,recursion,visual-c++,stack-overflow,C++,Recursion,Visual C++,Stack Overflow,一个2D数组代表一个图像,每个像素都有一种颜色,这个递归函数的任务是将像素(x,y)周围的相同颜色(c)的区域转换为一种新颜色(newC)。该函数工作正常,直到我通过一个大的数字,如x=200,y=200,然后出现一个SO。 我怎么处理这个案子?或者除了递归还有更好的解决方案吗 void Region(int x, int y, char newC, char c) { //c is current color, newC is new Color if(c == newC) retur

一个2D数组代表一个图像,每个像素都有一种颜色,这个递归函数的任务是将像素(x,y)周围的相同颜色(c)的区域转换为一种新颜色(newC)。该函数工作正常,直到我通过一个大的数字,如x=200,y=200,然后出现一个SO。 我怎么处理这个案子?或者除了递归还有更好的解决方案吗

void Region(int x, int y, char newC, char c) { //c is current color, newC is new Color
    if(c == newC) return;
    arr[y][x]=newC;
    if(arr[y][x-1 ]== c && x-1 > 0) Region(x-1, y, newC, c);
    if(arr[y-1][x] == c && y-1 > 0) Region(x, y-1, newC, c);
    if(arr[y][x+1] == c && x+1 <= M) Region(x+1, y, newC, c);
    if(arr[y+1][x] == c && y+1 <= N) Region(x, y+1, newC, c);
}
void区域(intx,inty,char-newC,char-c){//c是当前颜色,newC是新颜色
如果(c==newC)返回;
arr[y][x]=newC;
如果(arr[y][x-1]==c&&x-1>0)区域(x-1,y,newC,c);
如果(arr[y-1][x]==c和&y-1>0)区域(x,y-1,newC,c);

如果(arr[y][x+1]==c&&x+1因为您将整个内容更改为一种颜色,为什么不使用2个嵌套for循环,那么您就不必执行if语句检查,因此您的函数不会是递归的

试试这个:

for(int i = 0; i < y; i++){
  for(int j = 0; j < x; j++){
      arr[i][j] = newC;
  }
}
for(int i=0;i
在链接中,有一种比递归更有效的解决方案

整体填充(节点、目标颜色、替换颜色):

这是我第一次尝试将伪代码转换为C++:

std::deque<char> myqueue;
void Region(int x,int y,char newC,char c)
{
    char n;
    if(c==newC)return;
    myqueue.empty();
    myqueue.push_back(arr[y][x]);
    while (myqueue.size()!=0)
    {
        n=myqueue.back();
        myqueue.pop_back();
        if(n==c)
        {
            n=newC;
            if(x-1>0)    myqueue.push_back(arr[y][x-1]);
            if(y-1>0)    myqueue.push_back(arr[y-1][x]);
            if(x+1<=M)   myqueue.push_back(arr[y][x+1]);
            if(y+1<=N)   myqueue.push_back(arr[y+1][x]);
        }
    }
}
std::deque myqueue;
无效区域(整数x,整数y,字符newC,字符c)
{
字符n;
如果(c==newC)返回;
myqueue.empty();
myqueue.push_back(arr[y][x]);
while(myqueue.size()!=0)
{
n=myqueue.back();
myqueue.pop_back();
如果(n==c)
{
n=newC;
如果(x-1>0)myqueue.push_-back(arr[y][x-1]);
如果(y-1>0)myqueue.push_-back(arr[y-1][x]);

if(x+1)不是全部,所谓区域,我的意思是:要填充的区域R定义如下。像素(x,Y)属于该区域。另一个像素属于区域R,当且仅当它与像素(x,Y)具有相同的颜色,并且与属于该区域的任何像素有共同的一面时。无论如何,谢谢:)所以你想改变一个Y数量的X像素的颜色?我认为嵌套循环仍然适用于一个区域,你只需正确设置Y和X,其余的就可以了。我不完全理解你想改变哪些像素,也许你可以展示一个区域如何从一种颜色变为另一种颜色?ooooooooooovvooo OVVOOO OVVOOO ovvooooo这里我有两个区域Vs region和Os region,每个STRING之间都有一条折线。洪水填充会更改指定的元素和它旁边具有相同值的任何元素,因此在问题的示例中,如果选择2,2,则所有Vs都将更改为新值。但是,如果右下角有一个V,则d没有被更改,因为它没有连接到洪水填充的起点。您当前的答案根本没有解决这个问题。听起来您在谈论a,在这种情况下,最好使用链接中描述的基于堆栈的递归。@RogerRowland感谢链接的帮助!如果有人告诉我,我将不胜感激告诉我代码有什么问题:
void Region(int x,int y,char newC,char c){char n;if(c==newC)return;myqueue.empty();myqueue.push_back(arr[y][x]);while myqueue.size()!=0{n=myqueue.back();myqueue.pop_back();if(n==c=n=newC;if(x-1>0)myqueue.push_back;如果(x+1line
n=newC;
可能类似于
arr[y][x]=newC
,否则您不会用新颜色更新数组。您还需要将x+y坐标推到队列上,而不是推到字符上,以便知道在while循环的每次迭代中处理的是哪个元素。
std::deque<char> myqueue;
void Region(int x,int y,char newC,char c)
{
    char n;
    if(c==newC)return;
    myqueue.empty();
    myqueue.push_back(arr[y][x]);
    while (myqueue.size()!=0)
    {
        n=myqueue.back();
        myqueue.pop_back();
        if(n==c)
        {
            n=newC;
            if(x-1>0)    myqueue.push_back(arr[y][x-1]);
            if(y-1>0)    myqueue.push_back(arr[y-1][x]);
            if(x+1<=M)   myqueue.push_back(arr[y][x+1]);
            if(y+1<=N)   myqueue.push_back(arr[y+1][x]);
        }
    }
}