kid_0203
kid_0203
采纳率85.1%
2016-03-12 13:22

为什么我这个函数陷入了死循环

已采纳

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5

 #include<stdio.h>
int m,n,a[200][200]={0},b[200][200]={0},s=0,num=0;
void solve(int i,int j)
{
    if(b[i][j]==0&&i>=0&&j>=0&&i<m&&j<n)
    {
    printf("%d ",a[i][j]);
    num++; 
    if(num==m*n) return;
    b[i][j]==1;
    if(s%4==1)solve(i,++j);
    if(s%4==2)solve(--i,j);
    if(s%4==3)solve(i,--j);
    if(s%4==0)solve(++i,j);
    }
    else 
    {
    s++;
    if(s%4==1) solve(--i,++j);
    if(s%4==2) solve(--i,--j);
    if(s%4==3) solve(++i,--j);
    if(s%4==0) solve(++i,++j);
    }
}
int main()
{
    scanf("%d%d",&m,&n);
    int i,j;    
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    scanf("%d",&a[i][j]);
    solve(0,0);
    return 0;
}

我在函数void型函数里面用了return 想要跳出函数 不知为何结果是死循环

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • striveant striveant 5年前

    1 首先应该是 b[i][j]=1; (你多了一个=号)
    2 其次:你的recursive function 的终止条件没有设好(搭配你的if 写法):
    if(num==m*n) return;

    return的时候,由于你的写法全是if,而return时候s变大了
    所以在return到if(s%4==3)solve(i,--j);的时候又会执行下一行,加上你S++那边的部分没有终止条件就会造成死循环

    你可以把终止条件加到if else外面
    或者将s 的判断写成if else if的格式

    点赞 1 评论 复制链接分享
  • Chely_Yi Chely_Yi 5年前

    第十行 不应该用等于 要用赋值号 b[i][j] = 1;
    函数无法结束的原因是你的终止条件语句写在了if语句里面,debug的时候可以发现,满足条件return之后,还是会执行else语句,
    并一直执行else无法结束。 应该把这条语句拿出来,写成if...else if...else 的形式

    点赞 评论 复制链接分享
  • qq_27784899 秋夜无殇 5年前

    果然把if换成switch case就不死了。

    点赞 评论 复制链接分享
  • qq_27784899 秋夜无殇 5年前

    已经取过,则左转90度。这个没实现呢吧

    点赞 评论 复制链接分享
  • u012155923 咖啡不加盐 5年前

    终止条件有问题,以后遇上这种问题,可以在每个分支内打断言或者调试信息,来看程序运行期间都走了哪些分支

    点赞 评论 复制链接分享
  • bealing xSeeker~ 5年前
    if(num==m*n) return;
    改为
    if(num>=m*n) return;
    

    感觉其他地方也有问题。。。。

    点赞 评论 复制链接分享