kid_0203 2016-03-12 13:22 采纳率: 50%
浏览 1657
已采纳

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

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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 2016-03-12 15:26
    关注

    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的格式

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 Excel发现不可读取的内容
  • ¥15 UE5#if WITH_EDITOR导致打包的功能不可用
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。