題目
問題描述
回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉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
樣例輸入
3 2
1 2
3 4
5 6
樣例輸出
1 3 5 6 4 2
說明
利用循環結構,從數組的(0,0)個元素開始,依次向下輸出,向右輸出,向上輸出,向左輸出,此時爲第t==0圈輸出結束;然後從(1,1)開始,再次執行以上步驟,不斷循環,直到count==0跳出循環。
記得return 0 啊 T_T
代碼及註釋
#include<stdio.h>
int main() {
int n,m,count;
scanf("%d%d",&n,&m);
count=n*m;
int a[n][m],i,j;
for(i=0; i<n; i++) {
for(j=0; j<m; j++) {
scanf("%d",&a[i][j]);
}
}
//**********以上是數的輸入**************
int t=0;//t用於記錄圈數
i=0;//數的橫座標
j=0;//數的縱座標
while(count) {
//省略if(i==t&&j==t&&count),判斷座標是否在左上角的節點,因爲條件必然成立
while(i<n-t&&count) {//從左上角向下走
if(i==0&&j==0) {//第一個數的輸出格式
printf("%d",a[0][0]);
i++;
} else
printf(" %d",a[i++][j]);
count--;
}
i--;
j++;
//省略if(i==n-1-t&&j==t),左下角的節點的判斷
while(j<m-t&&count) {//向右走
printf(" %d",a[i][j++]);
count--;
}
j--;
i--;
//省略if(i==n-1-t&&j==m-1-t&&count),右下角節點的判斷
while(i>=t&&count) {//向上走
printf(" %d",a[i--][j]);
count--;
}
i++;
j--;
//省略if(i==t&&j==m-1-t),右上角節點的判斷
while(j>t&&count) {//向左走
printf(" %d",a[i][j--]);
count--;
}
j++;
i++;
t++;//圈數加一
}
return 0;
}