切換
舊版
前往
大廳
主題

ZeroJudge - e974: 2. 座位安排 (Seats) 解題心得

Not In My Back Yard | 2020-04-29 00:16:54 | 巴幣 2 | 人氣 422

題目連結:


題目大意:
給定三正整數 R 、 C 、 N (1 ≦ R 、 C 、 N ≦ 100),代表教室有 R 列、 C 行的座位,而現在是第 N 週。

第一週時,座號 1 號的坐在第一排最左邊第一個位置(第一行),剩下的同學由左至右、再由前而後依照學號入座。

從第二週以後開始,雙數週時所有人往右移一個位置,原本在最右邊的學生移到最左邊坐(第一行);單數週時,所有人往後一個位置,原本在最後一排的移到第一排坐。

求第 N 週時,現在教室的學號與座位分布為何?輸出格式參見範例輸出。



範例輸入:
範例輸入一:
2 4 1

範例輸入二:
4 5 4

範例輸入三:
1 3 11


範例輸出:
範例輸出一:
1 2 3 4
5 6 7 8

範例輸出二:
19 20 16 17 18
4 5 1 2 3
9 10 6 7 8
14 15 11 12 13

範例輸出三:
2 3 1


解題思維:
單純的模擬交換即可。

在交換的過程時,可以運用下面的技巧:
假設現在有五個數字要往右移,因為可能是存在陣列裡,所以寫作
A[0] A[1] A[2] A[3] A[4]
可以先行紀錄 A[4] 現在的值為 buffer ,然後由索引值大至小執行以下動作
A[i] = A[i - 1] ,即將該位置存的值變為該位置前一格的值。
最後到 A[0] 時,執行 A[0] = buffer ,即可完成將所有數字右移。

同理,後移也可以依照上述的方式進行。由此,就不須建立額外的陣列儲存新的排列,再將該排列複製回原陣列。此即為原地(In-place)的演算法。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作