八皇後問題(遞歸方法詳解)
阿新 • • 發佈:2018-11-30
span isp als using ostream 開始 int 對角線 沒有
八皇後遞歸詳解
核心代碼如下:
//八皇後遞歸解法 #include<iostream> using namespace std; int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; int count = 0;//定義一個全局變量 bool available(int pointi,int pointj) //判斷某個皇後是否與已有皇後沖突 { for(int i = 1; i<pointi; i++) { if(pointj == queen[i]) return false;//同一列拒絕View Codeif((pointi-i) == (pointj-queen[i])) return false;//同一主對角線拒絕 if((pointi-i) + (pointj-queen[i]) == 0) return false;//同一副對角線拒絕 } return true; } void findSpace(int queenNumber) //在第queenNumber行找能放皇後的位置 { //因為行數在遞歸中不斷調用(即行數在遞歸一次取下一行),所以只要遍歷列的位置 for(int i = 1; i<9; i++) //從1~8遍歷這一行的八個空位 { if(available(queenNumber,i)) { //如果可以放這個位置就記錄下第queenNumber個皇後的位置 queen[queenNumber] = i; if(queenNumber == 8) //如果八個皇後都放滿了統計一下 { count++;//次數就增加一次 return; } int nextNumber = queenNumber+1;//還有皇後沒放遞歸放下一個皇後(取下一行) findSpace(nextNumber);//遞歸 } } queen[--queenNumber] = -1;//如果這一行沒有可放的位置說明上一行皇後放的位置不行,要為上一個皇後尋找新的可放位置(即就要重新再找一次) return; } int main() { findSpace(1);//從(1,1)開始遞歸好理解 cout << count << endl; return 0; }
八皇後問題可以不只是限制於八個皇後,可以推廣到n皇後問題,下期介紹。
//八皇後遞歸解法(C語言寫法) //#include<iostream> //using namespace std; #include<stdio.h> int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; int count = 0;//定義一個全局變量 bool available(int pointi,int pointj) //判斷某個皇後是否與已有皇後沖突 { for(int i = 1; i<pointi; i++) { if(pointj == queen[i]) return false;//同一列拒絕 if((pointi-i) == (pointj-queen[i])) return false;//同一主對角線拒絕 if((pointi-i) + (pointj-queen[i]) == 0) return false;//同一副對角線拒絕 } return true; } void findSpace(int queenNumber) //在第queenNumber行找能放皇後的位置 { //因為行數在遞歸中不斷調用(即行數在遞歸一次取下一行),所以只要遍歷列的位置 for(int i = 1; i<9; i++) //從1~8遍歷這一行的八個空位 { if(available(queenNumber,i)) { //如果可以放這個位置就記錄下第queenNumber個皇後的位置 queen[queenNumber] = i; if(queenNumber == 8) //如果八個皇後都放滿了統計一下 { count++;//次數就增加一次 return; } int nextNumber = queenNumber+1;//還有皇後沒放遞歸放下一個皇後(取下一行) findSpace(nextNumber);//遞歸 } } queen[--queenNumber] = -1;//如果這一行沒有可放的位置說明上一行皇後放的位置不行,要為上一個皇後尋找新的可放位置(即就要重新再找一次) return; } int main() { findSpace(1);//從(1,1)開始遞歸好理解 //cout << count << endl; printf("%d\n",count); return 0; }C寫法
八皇後問題(遞歸方法詳解)