zxj5470 2016-06-05 13:56 采纳率: 0%
浏览 1525

关于java和c++递归调用的问题。。。

我的问题是计算围棋气数的。在C++上正常运行。移植到java后出现异常。只有部分值正确。显然是在递归上出了问题。
这个问题比http://bbs.csdn.net/topics/390162210 的要更为复杂。链接的内容只是简单的递归。
但是感觉上道理是差不多的。
个人感觉是递归调用中变量的作用域问题。得到的结果也很奇怪。代码和情况如下
C++:
#include
#include
#include
using namespace std;

int i, j, a[19][19], b[19][19];
void Srand();
int S(int i, int j);
int main() {
Srand();
cout<<endl;
for (i = 0; i<19; i++) {
for (j = 0; j<19; j++) {
b[i][j] = 1;
}};
cout<<endl;
int E[19][19];
for (int I = 0; I<19; I++) {cout<<" ";
for (int J = 0; J<19; J++) {
E[i][j]=S(I,J);
cout<<setw(2)<<E[i][j];

for (i = 0; i<19; i++) {
for (j = 0; j<19; j++) {
b[i][j] = 1;}}
}cout<<endl;
};
return 0;
}
//Srand()随机生成+展示
void Srand() {//
a[2][5]=-1;a[2][4]=1;a[3][3]=1;a[3][5]=1;a[5][3]=1;a[3][7]=1;a[3][9]=1;
a[3][4]=1;a[4][3]=-1;a[6][3]=-1;a[3][6]=-1;a[3][8]=-1;
cout << " ";
for (j = 0; j<19; j++) {
cout << setw(2) << j;
}
cout << endl;
srand((int)time(NULL));
for (i = 0; i<19; i++) {
cout << setw(2) << i;
for (j = 0; j<19; j++) {
// a[i][j] = rand() % 3 - 1;
if (a[i][j] == 0) { cout << " "; }
else if (a[i][j] == -1) { cout << "●"; }//等于-1输出实心圆圈
else if (a[i][j] == 1) { cout << "○"; }//等于1,输出空心圆圈
}
cout << setw(2) << i << endl;
}cout << " ";
for (j = 0; j<19; j++) {
cout << left << setw(2) << j;
}
};
//判断(i,j)的气数,可累加(递归)
int S(int i, int j) {
int Co = 0;
if ((a[i][j] == 1) || (a[i][j] == -1)) {//是黑白棋子才能判断
if (i == 0 || i == 18 || j == 0 || j == 18) {/*【找四个边角】*/
if (i == 0) {//第一行
if (j == 0) {//第一列(即左上角0,0点)
if (a[i][j + 1] == 0 && b[i][j + 1] == 1) { Co++; b[i][j + 1] = 0; };//右和下++
if (a[i + 1][j] == 0 && b[i+1][j] == 1) { Co++; b[i + 1][j] = 0; };

                if (a[i][j + 1] == a[i][j] && b[i][j + 1] == 1) { b[i][j + 1] = 0; Co += S(i, j + 1); }
                if (a[i + 1][j] == a[i][j] && b[i + 1][j] == 1) { b[i + 1][j] = 0; Co += S(i + 1, j); }
            }
            else if (j == 18) {//第19列(即右上角)

                if (a[i][j - 1] == 0 && b[i][j - 1] == 1) { Co++; b[i][j - 1] = 0; }//左j-1,
                if (a[i + 1][j] == 0 && b[i + 1][j] == 1) { Co++; b[i+1][j] = 0; }//
                if (a[i][j - 1] == a[i][j] && b[i][j - 1] == 1) { b[i][j - 1] = 0; Co += S(i, j - 1); }
                if (a[i + 1][j] == a[i][j] && b[i + 1][j] == 1) { b[i + 1][j] = 0; Co += S(i + 1, j); }
            }
            else if(j>0&&j<18)
            {//第一行的其他列
                if (a[i][j - 1] == 0 && b[i][j - 1] == 1) { Co++; b[i][j - 1] = 0; };//左右下++
                if (a[i][j + 1] == 0 && b[i][j + 1] == 1) { Co++; b[i][j + 1] = 0; };
                if (a[i + 1][j] == 0 && b[i + 1][j] == 1) { Co++; b[i + 1][j] = 0; };
                if (a[i][j - 1] == a[i][j] && b[i][j - 1] == 1) { b[i][j - 1] = 0; Co += S(i, j - 1); };//左右下++
                if (a[i][j + 1] == a[i][j] && b[i][j + 1] == 1) { b[i][j + 1] = 0; Co += S(i, j + 1); };
                if (a[i + 1][j] == a[i][j] && b[i + 1][j] == 1) { b[i + 1][j] = 0; Co += S(i + 1, j); };
            }
        }
        else if (i == 18) {//第19行
            if (j == 0) {//第1列(即左下角)
                if (a[i][j + 1] == 0 && b[i][j + 1] == 1) { Co++; b[i][j + 1] = 0; };//右和上++
                if (a[i - 1][j] == 0 && b[i - 1][j] == 1) { Co++; b[i - 1][j] = 0; };
                if (a[i][j + 1] == a[i][j] && b[i][j + 1] == 1) { b[i][j + 1] = 0; Co += S(i, j + 1); };//右和上++
                if (a[i - 1][j] == a[i][j] && b[i - 1][j] == 1) { b[i - 1][j] = 0; Co += S(i - 1, j); };
            }
            else if (j == 18) {//第1列(即右下角)
                if (a[i][j - 1] == 0 && b[i][j - 1] == 1) { Co++; b[i][j - 1] = 0; };//左和上++
                if (a[i - 1][j] == 0 && b[i - 1][j] == 1) { Co++; b[i - 1][j] = 0; };

                if (a[i][j - 1] == a[i][j] && b[i][j - 1] == 1) { b[i][j - 1] = 0; Co += S(i, j - 1); };//左和上++
                if (a[i - 1][j] == a[i][j] && b[i - 1][j ] == 1) { b[i - 1][j] = 0; Co += S(i - 1, j); };

            }
            else if(j>0&&j<18){//i-1为上一行,j+1,j-1为右侧一列和左侧一列。
                if (a[i - 1][j] == 0 && b[i - 1][j] == 1) { Co++; b[i - 1][j] = 0; };
                if (a[i][j + 1] == 0 && b[i][j + 1] == 1) { Co++; b[i][j + 1] = 0; };
                if (a[i][j - 1] == 0 && b[i][j - 1] == 1) { Co++; b[i][j - 1] = 0; }

                if (a[i - 1][j] == a[i][j] && b[i - 1][j] == 1) { b[i - 1][j] = 0; Co += S(i - 1, j); };
                if (a[i][j + 1] == a[i][j] && b[i][j + 1] == 1) { b[i][j + 1] = 0; Co += S(i, j + 1); };//左和上++
                if (a[i][j - 1] == a[i][j] && b[i][j - 1] == 1) { b[i][j - 1] = 0; Co += S(i, j - 1); };
            };
        }

        if (j == 0) {//第1列
            if (i>0 && i<18) {//非角落,仅边
                if (a[i - 1][j] == 0 && b[i - 1][j] == 1) { Co++; b[i - 1][j] = 0; };//上一行
                if (a[i + 1][j] == 0 && b[i + 1][j] == 1) { Co++; b[i + 1][j] = 0; };//下一行
                if (a[i][j + 1] == 0 && b[i][j + 1] == 1) { Co++; b[i][j + 1] = 0; }//右一列

                if (a[i - 1][j] == a[i][j] && b[i - 1][j] == 1) { b[i - 1][j] = 0; Co += S(i - 1, j); };
                if (a[i + 1][j] == a[i][j] && b[i + 1][j] == 1) { b[i + 1][j] = 0; Co += S(i + 1, j); };//左和上++
                if (a[i][j + 1] == a[i][j] && b[i][j + 1] == 1) { b[i][j + 1] = 0; Co += S(i, j + 1); };
            };
        }
        if (j == 18) {//第1列
            if (i>0 && i<18) {//非角落,仅边
                if (a[i - 1][j] == 0 && b[i - 1][j] == 1) { Co++; b[i - 1][j] = 0; };//上一行
                if (a[i + 1][j] == 0 && b[i + 1][j] == 1) { Co++; b[i + 1][j] = 0; };//下一行
                if (a[i][j - 1] == 0 && b[i][j - 1] == 1) { Co++; b[i][j - 1] = 0; };//左一列

                if (a[i - 1][j] == a[i][j] && b[i - 1][j] == 1) { b[i - 1][j] = 0; Co += S(i - 1, j); };
                if (a[i + 1][j] == a[i][j] && b[i + 1][j] == 1) { b[i + 1][j] = 0; Co += S(i + 1, j); };//左和上++
                if (a[i][j - 1] == a[i][j] && b[i][j - 1] == 1) { b[i][j - 1] = 0; Co += S(i, j - 1); };
            };
        }


    }
    else {//非边角
        if (a[i][j + 1] == 0 && b[i][j + 1] == 1) { Co++; b[i][j + 1] = 0; }//右和下++
        if (a[i + 1][j] == 0 && b[i + 1][j] == 1) { Co++; b[i + 1][j] = 0; };
        if (a[i][j - 1] == 0 && b[i][j - 1] == 1) { Co++; b[i][j - 1] = 0; };//左和上++
        if (a[i - 1][j] == 0 && b[i - 1][j] == 1) { Co++; b[i - 1][j] = 0; };
        if (a[i][j + 1] == a[i][j] && b[i][j + 1] == 1) { b[i][j + 1] = 0; Co += S(i, j + 1); };//右和下++
        if (a[i + 1][j] == a[i][j] && b[i + 1][j] == 1) { b[i + 1][j] = 0; Co += S(i + 1, j); };
        if (a[i][j - 1] == a[i][j] && b[i][j - 1] == 1) { b[i][j - 1] = 0; Co += S(i, j - 1); };//左和上++
        if (a[i - 1][j] == a[i][j] && b[i - 1][j] == 1) { b[i - 1][j] = 0; Co += S(i - 1, j); };
    };

};
return Co;

}

  • 写回答

4条回答 默认 最新

  • zxj5470 2016-06-05 13:57
    关注

    C++上运行结果图片说明

    评论

报告相同问题?

悬赏问题

  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题