2 kid 0203 kid_0203 于 2016.03.12 21: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   2016.03.12 23: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的格式

bealing
bealing   Rxr 2016.03.12 21:53
if(num==m*n) return;
改为
if(num>=m*n) return;

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

u012155923
u012155923   2016.03.13 08:39

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

qq_27784899
qq_27784899   2016.03.13 11:17

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

qq_27784899
qq_27784899   2016.03.13 15:17

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

Chely_Yi
Chely_Yi   2016.03.13 17:19

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!