a417: 螺旋矩陣
每行有一正整數T,代表有幾組測試資料
接下來有T行, 每行有N、M兩正整數
N為矩陣長寬,就是會有N*N矩陣
M為方向,M=1為順時鐘,M=2為逆時鐘
N範圍為1~100之間
3 1
2 2
1 2 3
8 9 4
7 6 5
1 4
2 3
'''
#define M 11 //矩陣行數
#define N 7 //矩陣列數
int matrix[M][N] = { 0 };
int row = 0;
int col = 0;
int start = 1; //起始值
int m =M;
int n = N;
//可以畫N/2個圈
for (int count = 0; count < N / 2; count++)
{
for (; col < n - 1; col++) //a排賦值
{
matrix[row][col] = start++;
}
for (; row < m - 1; row++) //b排賦值
{
matrix[row][col] = start++;
}
for (col = n - 1; col > count; col--) //c排賦值
{
matrix[row][col] = start++;
}
for (row = m- 1; row > count; row--) //d排賦值
{
matrix[row][col] = start++;
}
//進入下一圈
m--;
n--;
row++;
start--; //這裡是因為在換圈的時候會多加1
}
if (N % 2 != 0) //如果size為奇數則最後中間那一個數遍歷不到,這裡補上
{
int z = M - 2 *row;
for(int i=0 ; i< z ;++i)
matrix[row++][col + 1] =++ start ;
}
//輸出陣列
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
cout << setw(3) << matrix[i][j];//設定輸出寬度為3
}
cout << endl;
}
'''
N=7
M=7
s=1
print('輸入有N、M兩正整數')
print('N為矩陣長寬,就是會有N*N矩陣')
print('M為方向,M=1為順時鐘,M=2為逆時鐘')
N,s = map(int, input('輸入N、M兩正整數-->').split()) # m 為矩陣大小、s 為旋轉方向
a = []
row = 0
col = 0
start = 1 #//起始值
m =N
n = N
num=m*n
turn = 1 # 預設一開始為 1 ( 水平往右移動 )
x, y = 0, 0 # 數字從左上角 (0, 0) 出發
x1, y1 = 0, 0 # 起始為左上角 (0, 0)
x2, y2 = m - 1, m - 1 # 末端點為右下角 ( m-1, m-1 )
for i in range(N):
a.append([0] * N)
for row in a:
for elem in row:
print(elem, end=' ')
print()
for i in range(1,num+1): # 根據旋轉的方向,填入數字
if s == 1:
a[y][x] = i # 順時針
#print(a[y][x],end='')
else:
a[x][y] = i # 逆時針
if i == num: break # 如果已經填到最後一個數字,終止回圈
if turn == 1:
x = x + 1 # 如果水平往右,x 增加 1
if turn == 2:
y = y + 1 # 如果垂直往下,y 增加 1
if turn == 3:
x = x - 1 # 如果水平往左,x 減少 1
if turn == 4:
y = y - 1 # 如果垂直往上,y 減少 1
if x == x2 and y == y1 and turn == 1: # 如果水平往右碰到右上端點
turn = 2 # 改成垂直往下
y1 = y1 + 1 # 起始點的 y 增加 1
if x == x2 and y == y2 and turn == 2: # 如果垂直往下碰到右下端點
turn = 3 # 改成水平往左
x2 = x2 - 1 # 末端點的 x 減少 1
if x == x1 and y == y2 and turn == 3: # 如果水平往左碰到左下端點
turn = 4 # 改成垂直往上
y2 = y2 - 1 # 末端點的 y 減少 1
if x == x1 and y == y1 and turn == 4: # 如果垂直往上碰到左上端點
turn = 1 # 改成水平往右
x1 = x1 + 1 # 起始點的 x 增加 1
print('\n')
for row in a:
for elem in row:
print(f'{elem: 5d}', end='') # 字串格式化輸出,長度為 5,前方多一個空白
print()
>>> %Run a417.py
輸入有N、M兩正整數
N為矩陣長寬,就是會有N*N矩陣
M為方向,M=1為順時鐘,M=2為逆時鐘
輸入N、M兩正整數-->4 2
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
>>>
沒有留言:
張貼留言