โจทย์
ลาตินสแควร์ (Latin square) คือเมทริกซ์ที่มีรูปแบบพิเศษ มาดูตัวอย่างต่างๆ เพื่อตรวจสอบรูปแบบ
1 2 2 1 1 2 3 3 1 2 2 3 1 1 2 3 4 4 1 2 3 3 4 1 2 2 3 4 1
ลาตินสแควร์ที่คุณได้จะมีขนาดต่างกันไปตามที่คุณสังเกตในตัวอย่างข้างต้น แต่ถ้าคุณสังเกตรูปแบบของเมทริกซ์ข้างต้นอย่างละเอียด คุณจะพบว่าตัวเลขสุดท้ายของแถวก่อนหน้าจะมาเป็นองค์ประกอบแรกของแถวถัดไป
นั่นคือรูปแบบที่ซ่อนอยู่ในลาตินสแควร์ เราต้องเขียนโปรแกรมที่สร้างเมทริกซ์ข้างต้นสำหรับอินพุต n
อัลกอริธึม
- กำหนด n ด้วยตัวเลขที่คุณชอบ
- กำหนดตัวเลขด้วยค่า n + 1 เรียกว่า first_half_end
- เขียนลูปที่วนรอบจาก 1 ถึง n ทั้งสองรวม
- กำหนดค่า first_half_end ให้กับตัวแปรที่เรียกว่า first_half_start
- เขียนลูปจนกว่า first_half_start จะถึงค่า n
- พิมพ์ตัวแปรวนรอบ คือ first_half_start
- เขียนลูปที่วนรอบจาก 1 ถึง first_half_end
- พิมพ์ตัวแปรวนรอบ
- ลดค่า first_half_end ลง 1
- ขึ้นบรรทัดใหม่
การนำไปใช้งาน
ต่อไปนี้เป็นการนำไปใช้งานของอัลกอริธึมข้างต้นใน C++
#include <bits/stdc++.h>
using namespace std;
void generateLatinSquare(int n) {
int first_half_end = n + 1;
for (int i = 1; i <= n; i++) {
int first_half_start = first_half_end;
while (first_half_start <= n) {
cout << first_half_start << " ";
first_half_start++;
}
for (int second_half_start = 1; second_half_start < first_half_end; second_half_start++){
cout << second_half_start << " ";
}
first_half_end--;
cout << endl;
}
cout << endl;
}
int main(void) {
generateLatinSquare(2);
generateLatinSquare(3);
generateLatinSquare(4);
return 0;
}
ผลลัพธ์
หากคุณรันโค้ดข้างต้น คุณจะได้ผลลัพธ์ดังนี้
1 2 2 1 1 2 3 3 1 2 2 3 1 1 2 3 4 4 1 2 3 3 4 1 2 2 3 4 1