八皇后的非遞迴問題
阿新 • • 發佈:2018-12-10
//八皇后問題
/*八皇后是一個 8*8 64個方塊 要求:1:每一行只能放一個放一個皇后 2:每一列只能放一個皇后 3:左斜線(15),右斜線(15)上只能有一個皇后,並且放夠8個皇后 演算法:宣告三個陣列和一個棧,三個陣列分別對應列,左斜線和右斜線,每行遍歷一回,判斷列,左右斜線是否有皇后,若無,則放, 若有,則,下一列,直到棧滿結束,一組解,在棧中輸出 */ //非遞迴,只求一個解
#include<stdio.h> #include<stdlib.h> int col[8] = { 0,0,0,0,0,0,0,0};//檢視那一列是否放皇后 int right[15] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };//每一條斜線 int left[15] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; int Q[8]; void EightQueen() { int top=-1, i=0, j=0; while (top != 7) { //每一行的八列 for (; j < 8; j++) { if (!col[j] && !left[i + j] && !right[7 - i + j]) { Q[++top] = j; col[j] = left[i + j] = right[7 - i + j] = 1; i++; j = 0; break; } } if (j == 8) { i--; col[j] = left[i + j] = right[7 - i + j] = 0; j++; } } } void printEightQueen() { //輸出一組解 for (int i = 0; i < 8; i++) printf("%d,%d\t", i, Q[i]); } int main(void) { EightQueen(); printEightQueen(); return 0; }