程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> c語言-為什麼我這個函數陷入了死循環

c語言-為什麼我這個函數陷入了死循環

編輯:編程解疑
為什麼我這個函數陷入了死循環

回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉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的格式

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved