Test Message

a417: 螺旋矩陣

內容

輸出一螺旋矩陣。


輸入

每行有一正整數 T,代表有幾組測試資料

接下來有 T 行, 每行有 N、M 兩正整數

N 為矩陣長寬,就是會有 N*N 矩陣

M 為方向,M=1 為順時鐘,M=2 為逆時鐘

N 範圍為 1~100 之間

2
3 1
2 2

輸出

把矩陣輸出,矩陣值之間寬度為 5,就是[00000]寬度

C++可用 setw(5)或 C 的%5d 輸出

1     2     3
8     9     4
7     6     5

1     4
2     3

解題思路

螺旋路徑走訪二微矩陣的方法:

  1. sr = er = ec = 0 , sc = -1 (因為他是進入點)
  2. sc++ , 從 table[sr,sc] 走訪到 table[sr,ec] (左上 → 右上)
  3. sr++ , 從 table[sr,ec] 走訪到 table[er,ec] (右上 → 右下)
  4. ec++ , 從 table[er,ec] 走訪到 table[er,sc] (右下 → 左下)
  5. er++ , 從 table[er,sc] 走訪到 table[sr,sc] (左下 → 左上)
  6. 判斷已走訪的元素數量是否等於二維矩陣最大元素數,是:跳出迴圈,否:回到(1.)

順逆時針部分只要再輸出時反過來輸出就可以了。

table[i][j] → table[j][i]


完整程式碼

AC (66ms, 124KB)
#include <stdio.h>

int table[100][100];

int main()
{
int kase, n, m;
scanf(" %d", &kase);
while (kase--)
{
scanf(" %d %d", &n, &m);
int now = 1, end = n * n, sr = 0, sc = -1, er = n - 1, ec = n - 1, i, j;
while (now <= end)
{
for (j = ++sc; j <= ec; j++)
table[sr][j] = now++;
for (i = ++sr; i <= er; i++)
table[i][ec] = now++;
for (j = --ec; j >= sc; j--)
table[er][j] = now++;
for (i = --er; i >= sr; i--)
table[i][sc] = now++;
}
if (m == 1)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
printf("%5d", table[i][j]);
putchar('\n');
}
}
else
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
printf("%5d", table[j][i]);
putchar('\n');
}
}
}
return 0;
}