遞歸與N皇后問題

遞歸的基本概念

一個函數調用其自身,就是遞歸

遞歸的作用

1) 替代多重循環
2) 解決本來就是用遞歸形式定義的問題
3) 將問題分解爲規模更小的子問題進行求解

一行只能有一個皇后,這個根據遊戲規則中的皇后的勢力就可以得知。
首先先讓A皇后放在左上角(0,0),B皇后再從第二行找到合適的位置,以此類推C皇后在第三行找到合適的位置,一直到N皇后,一組解就出來了,但是問題並不是這麼簡單。
假設現在是4皇后問題,第A個皇后在(0,0)B皇后在(1,3)
C皇后在(3,1)此時D皇后就無位置可以放置。
細心的你,可能會有疑問,每次D皇后,找不到合適的位置,就去讓BC重新尋找位置,當BC皇后在它所處的行,再也找不到合適的位置,A皇后的位置就需要變動了。棋盤上就一個皇后A,尋找他的合適位置只需右移一個位置即可。A皇后位移後,再去爲BC皇后找合適位置,如果有合適位置,就再去爲D皇后尋找合適的位置;如果BC皇后都沒有合適的位置,就需要再次右移A皇后,循環上面的過程。

#include<bits/stdc++.h>
using namespace std;
int N;
int queenPos[100];
/*用來存放算好的皇后位置。最左上角是(0,0)
每一行都有一個只用記錄它的列座標*/
void NQueen(int k);
int main()
{
    cin >> N;
    NQueen(0); //從第0行開始擺皇后
    return 0;
}
void NQueen(int k) 
{ //在0~k-1行皇后已經擺好的情況下,擺第k行及其後的皇后
    int i;
    if(k==N)
    { // N 個皇后已經擺好
        for(i=0;i<N;i++)
        cout<<queenPos[i]+1<<" ";
        cout<<endl;
        return ;
    }
    for(i=0;i<N;i++) 
    { //逐嘗試第k個皇后的位置
        int j;
        for( j = 0; j < k; j ++ ) 
        {//和已經擺好的k 個皇后的位置比較,看是否衝突
            if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j))  break; 
            //衝突,則試下一個位置
        }
        if( j == k ) 
        { //當前選的位置i 不衝突
            queenPos[k] = i; //將第k個皇后擺放在位置i
            NQueen(k+1);
        }
    }      
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章