8 Queens Problem คือหัวข้อที่โด่งดังในหมู่นักคณิตศาสตร์และนักพัฒนาโปรแกรมมิ่ง ปัญหานี้ตั้งข้อสมมติว่า คุณมีกระดานหมากรุกขนาด 8x8 และต้องการวางแต่ละราชินีแปดตัวลงบนกระดานโดยไม่ให้ราชินีตัวใดๆ สามารถจับราชินีอื่นได้ (ในรูปแบบการเคลื่อนที่ของราชินีในหมากรุกที่สามารถเดินได้ทั้งแนวตั้ง, แนวนอน และแนวทแยงมุม) ปัญหานี้แท้จริงแล้วเป็นตัวอย่างหนึ่งของปัญหาระบบความผิดพลาดที่สามารถแก้ได้ด้วยการใช้วิธีการทางคณิตศาสตร์และการเขียนโปรแกรม.
หนึ่งในวิธีการแก้ปัญหา Popular มากที่สุดคือการใช้ Backtracking Algorithm ซึ่งเป็นวิธีการหาคำตอบโดยลองทุกโอกาสที่เป็นไปได้จนกว่าจะหาคำตอบที่ถูกต้องหรือไม่เหลือโอกาสที่จะลองอีกต่อไป. Backtracking มีประสิทธิภาพในปัญหานี้เพราะมันสามารถกำจัดสถานะที่ไม่ต้องการได้อย่างรวดเร็ว และเน้นไปที่การค้นหาสถานะที่อาจนำไปสู่คำตอบ.
#include
#include
#define N 8
// ฟังก์ชันสำหรับพิมพ์หลักของกระดาน
void printBoard(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
// ตรวจสอบว่าตำแหน่งที่เลือกปลอดภัยหรือไม่
int isSafe(int board[N][N], int row, int col) {
int i, j;
//ตรวจสอบหมากในแถวเดียวกันในด้านซ้าย
for(i = 0; i < col; i++)
if(board[row][i])
return 0;
//ตรวจสอบหมากในแนวทแยงมุมบนซ้าย
for(i = row, j = col; i >= 0 && j >= 0; i--, j--)
if(board[i][j])
return 0;
//ตรวจสอบหมากในแนวทแยงมุมล่างซ้าย
for(i = row, j = col; j >= 0 && i < N; i++, j--)
if(board[i][j])
return 0;
return 1;
}
// ฟังก์ชันที่ใช้ Backtracking ในการวางราชินี
int solveNQUtil(int board[N][N], int col) {
// ถ้าถึงหมากสุดท้ายแล้ว, แสดงว่าได้หาคำตอบ
if(col == N) {
printBoard(board);
return 1;
}
// พยายามวางราชินีในทุกแถวของคอลัมน์ปัจจุบัน
for(int i = 0; i < N; i++) {
// ตรวจสอบว่าสามารถวางราชินีได้หรือไม่
if(isSafe(board, i, col)) {
// วางราชินี
board[i][col] = 1;
// ไปยังการวางราชินีคอลัมน์ถัดไป
if(solveNQUtil(board, col + 1))
return 1;
// ถ้าวางราชินีแล้วไม่ได้ผล, ลบราชินี (backtrack) และลองใหม่
board[i][col] = 0;
}
}
// ถ้าราชินีไม่สามารถวางในคอลัมน์ใดลำดับนั้นได้ แสดงว่าไม่มี solution
return 0;
}
// ฟังก์ชันหลักที่โซล ปัญหา 8 Queen
void solveNQ() {
int board[N][N] = {{0}};
if(!solveNQUtil(board, 0)) {
printf("Solution does not exist");
return;
}
return;
}
int main() {
solveNQ();
return 0;
}
ในโลกจริงนั้น, 8 Queens Problem ไม่ได้ใช้โดยตรงในการแก้ปัญหา แต่หลักการของมันสามารถประยุกต์ใช้ได้กับปัญหาการวางตำแหน่งในทุกสาขาอาชีพ เช่น ในการออกแบบกลยุทธ์เกม, การจัดตารางงานในโรงงาน, และการออกแบบระบบ select ในฐานข้อมูล.
Complexity:
เมื่อพูดถึงความซับซ้อนของ backtracking algorithm, ต้องใช้เวลาการคำนวณที่ถูก express ในรูปของ O(n!) สำหรับการทดลองแต่ละครั้งใน worst case สิ้นสุดทั้งหมดซึ่งรวมกันแล้วเป็นเวลาที่นานมาก.
ข้อดี:
1. สามารถหาคำตอบที่แน่นอนได้ถ้ามีคำตอบอยู่จริง
2. ไม่ต้องทำการคำนวณทั้งหมดหากพบว่าสถานการณ์ไม่ได้ผล
ข้อเสีย:
1. เวลาการทำงานที่นานในปัญหาที่มีขนาดใหญ่
2. ใช้หน่วยความจำสูงส่วนหนึ่งในการจัดเก็บสถานะการวางตำแหน่ง
หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการแก้ปัญหาด้านการเขียนโปรแกรมที่ซับซ้อนอย่าง 8 Queens Problem หรือหัวข้อโปรแกรมมิ่งอื่นๆ ที่เป็นทั้งท้าทายและสร้างความรู้สึกผจญภัยในโลกของ การเขียนโค้ด, ที่ EPT (Expert-Programming-Tutor) เรามั่นใจว่าคุณจะได้รับประสบการณ์ที่ยอดเยี่ยมขณะที่ฝึกฝนทักษะการเขียนโปรแกรมของคุณ พวกเรามีคณะผู้สอนที่มิใช่เพียงแค่ผู้ชำนาญการแต่ยังใส่ใจในการพัฒนาความสามารถของนักเรียนในทุกระดับ. ไม่ว่าจะเป็นระดับเริ่มต้นหรือขั้นสูงก็ตาม, มาที่ EPT แล้วเราจะเร่งขั้นความสามารถของคุณไปอีกขั้น!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
Tag ที่น่าสนใจ: 8_queens_problem c_programming backtracking_algorithm chessboard n_queens_problem recursive_algorithm code_example complexity_analysis programming_challenges
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM