題目描述: 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 輸入: 輸入可能包含多個測試樣例,對於每個測試案例, 輸入的第一行包括兩個整數m和n(1<=m,n<=1000):表示矩陣的維數為m行n列。 接下來的m行,每行包括n個整數,表示矩陣的元素,其中每個元素a的取值范圍為(1<=a<=10000)。 輸出: 對應每個測試案例,輸出一行, 按照從外向裡以順時針的順序依次打印出每一個數字,每個數字後面都有一個空格。 樣例輸入: 4 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 樣例輸出: 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 代碼AC: 思想:這題沒什麼算法,控制好邊界就可以了~ [cpp] #include <stdio.h> typedef struct mat { int num; int flag; }mat; int main() { mat ma[1000][1000]; int i, j, m, n, dir, count; while( scanf("%d%d", &m, &n) != EOF ) { for( i = 0; i < m; i++ ) { for( j = 0; j < n; j++ ) { scanf("%d", &ma[i][j].num); ma[i][j].flag = 0; } } dir = 0; // 左 - 下 - 右 - 上 循環 count = 0; i = 0; j = 0; while( count < n * m ) { switch( dir ) { case 0: if( j < n ) { if( !ma[i][j].flag ) { printf("%d ", ma[i][j].num); ma[i][j].flag = 1; count++; j++; } else { j--; i++; dir += 1; dir %= 4; } } else { j--; i++; dir += 1; dir %= 4; } break; case 1: if( i < m ) { if( !ma[i][j].flag ) { printf("%d ", ma[i][j].num); ma[i][j].flag = 1; count++; i++; } else { i--; j--; dir += 1; dir %= 4; } } else { i--; j--; dir += 1; dir %= 4; } break; case 2: if( j >= 0 ) { if( !ma[i][j].flag ) { printf("%d ", ma[i][j].num); ma[i][j].flag = 1; count++; j--; } else { j++; i--; dir += 1; dir %= 4; } } else { j++; i--; dir += 1; dir %= 4; } break; case 3: if( i >= 0 ) { if( !ma[i][j].flag ) { www.2cto.com printf("%d ", ma[i][j].num); ma[i][j].flag = 1; count++; i--; } else { i++; j++; dir += 1; dir %= 4; } } else { i++; j++; dir += 1; dir %= 4; } break; } } printf("\n"); } return 0; }