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