遞歸的基本概念
一個函數調用其自身,就是遞歸
遞歸的作用
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);
}
}
}