八皇后問題回溯非遞迴演算法的C語言實現(文中是C語言的基本語法)
阿新 • • 發佈:2019-01-09
之前在CSDN的部落格上看到過大神們寫的回溯非遞迴程式碼,無奈C語言屬於初級階段無法理解位運算子等,所以自己寫了一個,此演算法雖不算簡潔,但看完應該就能理解演算法所要表達的思想。小弟的第一篇部落格,大神勿噴
#include<stdio.h> int chess[8][8];//定義8*8的棋盤,其中0表示該位置沒有皇后,1表示該位置有皇后 int count = 0; int judge(int r,int c)//這個是判斷函式,判斷此行此列能不能放皇后 { int i; int j; for(i=0;i<8;i++)//檢查當前位置所在列有沒有其他的皇后 { if(chess[i][c]) return 0; } for(i=r,j=c;i>=0&&j>=0;i--,j--)//檢查當前位置的左上斜線有沒有其他皇后 { if(chess [i][j]) return 0; } for(i=r,j=c;i>=0&&j<8;i--,j++)//檢查當前位置的右上斜線有沒有皇后 { if(chess[i][j]) return 0; } return 1;//全部都沒有,說明此位置可以放皇后,返回1 } void eightQueen() { int stack[9] = {0,0,0,0,0,0,0,0,0};//此處定義為9個,此陣列實際為棧,用來儲存每一行已經搜尋的列,其中第一行下標為0 int top = 0; int i; while(top>=0) if (top == 8)//注意top = 0為第一行,=8時已為第九行 { count++; //用來記八皇后的個數 top--; //返回到第八行 stack[top]++; } else { for(;stack[top]<8; stack[top]++) { if(judge(top,stack[top])) { chess[top][stack[top]] = 1; break; } } if(stack[top] < 8 && top <8) { top++; } else if (stack[top] == 8 && top <8) { for (i=0;i<8;i++) { chess[top][i] = 0; //此處兩行是將當前行和即將回溯到的那一行清空。 chess[top-1][i] = 0; } stack[top--] = 0; //因為要回溯到上一行,所以此行的棧記錄要變為零,下次到這一行時繼續從第一個元素判斷 stack[top]++; //上一行的元素加1,不加1還是判斷的是之前的位置,會死迴圈 } } } int main() { int i ; int j ; for(i=0;i<8;i++)//初始化棋盤 { for(j=0;j<8;j++) { chess[i][j] = 0; } } eightQueen(); printf("%d",count);//打印出一共有多少種擺法 return 0; }