回溯算法 n后问题
2013-01-03 15:41
260 查看
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
使用回溯算法求解的问题特征,求解问题要分为若干步,且每一步都有几种可能的选择,而且往往在某个选择不成功时需要回头再试另外一种选择,如果到达求解目标则每一步的选择构成了问题的解,如果回头到第一步且没有新的选择则问题求解失败。
该问题也可扩展到N后问题求解,只需修改程序main函数中的n值即可。
/************************************************************************
* 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;
}
问题描述:
八皇后问题是大数学家高斯于1850年提出来的。该问题是在8×8的国际象棋棋盘上放置8个皇后,使得没有一个皇后能“吃掉”任何其他一个皇后,即没有任何两个皇后被放置在棋盘的同一行、同一列或同一斜线上。要求:
编一个程序求出该问题的所有解。算法思想:
回溯法使用回溯算法求解的问题特征,求解问题要分为若干步,且每一步都有几种可能的选择,而且往往在某个选择不成功时需要回头再试另外一种选择,如果到达求解目标则每一步的选择构成了问题的解,如果回头到第一步且没有新的选择则问题求解失败。
该问题也可扩展到N后问题求解,只需修改程序main函数中的n值即可。
代码如下:
/************************************************************************
* 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皇后问题
- 回溯算法之N皇后问题
- m着色问题(回溯算法)
- 回溯算法求解迷宫问题
- 关于N皇后问题高效试探回溯算法的分析
- 最优装载问题 回溯算法
- 基础算法系列总结:回溯算法(解火力网问题)
- 国际象棋“皇后”问题的回溯算法
- 计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)
- 八皇后问题与回溯算法
- hdu 2553 N皇后问题(回溯算法)
- 回溯算法与八皇后问题
- 回溯算法(BackTracking)--八皇后问题
- 国际象棋“皇后”问题的回溯算法
- 幂集问题----搜索算法(回溯算法)
- 算法设计与分析题目练习三:骑士旅游问题(回溯算法)
- 回溯算法之骑士旅行问题
- 八皇后问题(经典回溯算法)
- 关于N皇后问题高效试探回溯算法的分析
- 背包问题的回溯算法