資料結構——八皇后遞迴解法
阿新 • • 發佈:2018-12-03
程式碼來源:https://www.cnblogs.com/houkai/p/3480940.html
參考程式碼:(註解多為自己填寫)
#include <iostream>
#include <stdlib.h>
using namespace std;
//k為第幾行,a[k]為第幾列
bool check_2 (int a[],int n)
{
for(int i=1;i<=n-1;i++)//依次判斷n行之前的皇后是否與n行皇后衝突
{
if((abs(a[i]-a[n])==n-i)||(a[i]==a[n]))//對角線不相等且不在同一列
return false;
}
return true;
}
int a[100], n, count;
void backtrack(int k)
{
if (k>n)//當k=n+1時找到解
{
for(int i=1;i<=8;i++)
{
//cout<<a[i];
}
//cout<<endl;
count++;
}
else
{
for (int i = 1;i <=n; i++)//找不到合適的列(位置),回到上一行
{
a[k] = i; //依次尋找適合的列
if (check_2(a,k) == 1)//當前皇后的位置符合要求,則求下一個皇后
{backtrack(k+1);} //遞迴呼叫,進入下一行(即下一個皇后)
}
}
}
int main()
{
n=8,count=0;
backtrack(1);//從第一行開始
cout<<count<<endl;
}
某道程式填空題修改後結果:
//求解N 皇后問題
#include <stdio.h>
#include <stdlib.h>
#define N 20 //最多皇后個數
int q[N]; //存放各皇后所在的列號,即(i,q[i])為一個皇后位置
int count = 0; //累計解個數
void dispasolution(int n) //輸出n 皇后問題的一個解
{
printf(" 第%d 個解:", ++count);
for(int i = 1; i <= n; i++)
printf("(%d,%d) ", i, q[i]);
printf("\n");
}
//i代表行,j代表列
bool place(int i, int j) //測試(i,j)位置能否擺放皇后
{
int k=1;
if(i == 1)
return true; //第一個皇后總是可以放置int k = 1;
while( k<=i-1 ) {//1 //k=1~i-1 是已放置了皇后的行
if((q[k] == j ) || (abs(q[k] - j))== i-k )//2 3
return false;
k++;
}
return true;
}
void queen(int i, int n) //放置 1~i 的皇后
{
if( i>n )//4
dispasolution(n); //所有皇后放置結束
else {
for(int j = 1; j <= n; j++) //在第i 行上試探每一個列j
if(place(i, j)) {
//在第i 行上找到一個合適位置(i,j)
q[i]=j ;//5
queen(i+1, n) ;//6
}
}
}
int main()
{
int n; //n 為存放實際皇后個數
printf(" 皇后問題(n<20) n=");
scanf("%d", &n);
if(n > 20)
printf("n 值太大,不能求解\n");
else {
printf("%d 皇后問題求解如下:\n", n);
queen(1, n); //放置 1~i 的皇后
}
}
自己參考後用c寫的,但有錯誤,暫時還不知道為什麼錯
#include <stdio.h>
#include <stdlib.h>
int i,n,count,a[100];
int check(int a[],int n)
{
for(i=1;i<=n-1;i++)
{
if((abs(a[n]-a[i])==n-i)||(a[n]==a[i]))
return 0;
}
return 1;
}
void recursion(int k)
{
if(k>n)
{
printf("111\n");
count++;
}
else
{
for(i=1;i<=n;i++)
{
a[k]=i;
if(check(a,k)==1)
{ recursion(k+1);
printf("111\n");
}
}
}
}
int main()
{
n=8;
count=0;
printf("%d",count);
recursion(1);
printf("%d",count);
}