2022年9月1日 星期四

Python a417: 螺旋矩陣

a417: 螺旋矩陣


輸入說明

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

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

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

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

N範圍為1~100之間 

範例輸入 #1

3 1

2 2
範例輸出 #1
    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

>>> 

沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...