本博客(http://blog.csdn.net/livelylittlefish)貼出作者(三二一、小魚)相關研究、學習內容所做的筆記,歡迎廣大朋友指正!
問題描述:
要求:
算法思想:
代碼如下:
* n後問題求解
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define MAXNUMBER 20
//判斷當前得到的解向量是否滿足問題的解
bool place_queen(int x[],int k)
{
int i;
for(i=1;i<k;i++)
{
if((x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k)))
return false;
}
return true;
}
//將結果簡單信息打印到屏幕
void output_queens(int x[],int n)
{
for(int i=1;i<=n;i++)
printf("%3d",x[i]);
printf(" ");
}
//將結果詳細信息寫入文件
void output_queens(FILE *fp,int number,int x[],int n)
{
fprintf(fp,"solution %d: ",number);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(j==x[i])
fprintf(fp,"1 ");
else
fprintf(fp,"0 ");
}
fprintf(fp," ");
}
fprintf(fp," ");
}
/************************************************************************
* n後問題求解
* input : n, the number of queens
* output : the vector of solution, X
************************************************************************/
int n_queens(FILE *fp,int n,int x[])
{
int nCount=0; //解個數
int k=1; //先處理第1個皇后
x[1]=0;
while(k>0)
{
x[k]=x[k]+1;//在當前列加1的位置開始搜索
while(x[k]<=n && !place_queen(x,k)) //當前列位置是否滿足條件
x[k]=x[k]+1; //不滿足,繼續搜索下一列位置
if(x[k]<=n) //若存在滿足條件的列
{
if(k==n)//是最後一個皇后,則得到一個最終解
{
//break; //此處若break,則只能得到一個解
nCount++;
output_queens(x,n); //輸出
output_queens(fp,nCount,x,n);
}
else //否則,處理下一個皇后,即第 k+1 個皇后
{
k++;
x[k]=0;
}
}
else //若不存在滿足條件的列,則回溯
{
x[k]=0; //第k個皇后復位爲0
k--; //回溯到前一個皇后
}
}
return nCount;
}
int main()
{
int n=8,x[MAXNUMBER]={0};
FILE *fp=fopen("8皇后問題的解.txt","w");
if(fp==NULL)
{
printf("can not wirte file!");
exit(0);
}
printf("the queens are placed on the coloums : ");
//求解並寫入文件
int nCount=n_queens(fp,n,x);
printf("there are %d solutions! ",nCount);
fclose(fp);
getch();
return 0;
}
回溯算法 n後問題
八皇后問題是大數學家高斯於1850年提出來的。該問題是在8×8的國際象棋棋盤上放置8個皇后,使得沒有一個皇后能“吃掉”任何其他一個皇后,即沒有任何兩個皇后被放置在棋盤的同一行、同一列或同一斜線上。
編一個程序求出該問題的所有解。
回溯法
使用回溯算法求解的問題特徵,求解問題要分爲若干步,且每一步都有幾種可能的選擇,而且往往在某個選擇不成功時需要回頭再試另外一種選擇,如果到達求解目標則每一步的選擇構成了問題的解,如果回頭到第一步且沒有新的選擇則問題求解失敗。
該問題也可擴展到N後問題求解,只需修改程序main函數中的n值即可。
/************************************************************************
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.