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

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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 想要跳出函数 不知为何结果是死循环

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

if(num==m*n) return;
改为
if(num>=m*n) return;

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

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

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

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

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