回溯算法实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中南大学
《算法设计与分析》实验报告
姓名:
专业班级:
学号:
指导教师:
完成日期:20010.1
一.实验名称
回溯算法实验
二.实验目的
1. 掌握回溯算法思想
2. 掌握回溯递归原理
3. 了解回溯法典型问题
三.实验内容
1. 编写一个简单的程序,解决8皇后问题
2. 批处理作业调度
3. 数字全排列问题
四.算法思想分析
1. 编写一个简单的程序,解决8皇后问题
在N*N的棋盘上,放置N个皇后,要求每一横行,每一列,每一对角线上均只能放置一个皇后,求可能的方案及方案数。问题的状态即棋盘的布局状态,状态空间树的根为空棋盘,每个布局的下一步可能布局为该布局结点的子结点;任意两个王后不放在同一行或同一列或同一斜线。因此为了简化状态空间树,采用逐行布局的方式,即每个布局有n个子结点
回溯过程分析:
(1)从空棋盘起,逐行放置棋子。
(2)每在一个布局中放下一个棋子,即推演到一个新的布局。
(3)如果当前行上没有可合法放置棋子的位置,则回溯到上一行,重新布放上一行的棋子。
2. 批处理作业调度
给定n个作业的集合J=(J1, J2, … , Jn)。每一个作业Ji都有两项任务需要分别在2台机器上完成。每一个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器i的处理时间为tji,i=1,2, … ,n; j=1,2。对于一个确定的作业调度,设Fji是作业i在机器i上完成处理的时间。则所有作业在机器2上完成处理的时间和成为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定一个最佳的作业调度方案,使其完成时间和达到最小。
要求输入: a.作业数 b.每个作业完成时间表:
要求输出: a.最佳完成时间 b.最佳调度方案
3. 数字全排列问题
任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:123,132,213,231,312,321。
注意:数字不能重复,N由键盘输入(N<=9)。
五.算法源代码及用户屏幕
1. 八皇后问题
(备注:语言:c;编译环境:c-free3.5;共1个文件)
#include
#define N 8
int count=0;
int M[N]={0},L[2*N]={0},R[2*N]={0};
int A[N][N]={0};
void print(int A[N][N]);
void main()
{
int mytry(int i,int M[N],int L[2*N],int R[2*N],int A[N][N]);
int n=mytry(0,M,L,R,A);
cout<<"\n count="< } int mytry(int i,int M[N],int L[2*N],int R[2*N],int A[N][N]) { for(int j=0; j if(!M[j]&&!L[i-j+N]&&!R[i+j]) { A[i][j]=1; M[j]=L[i-j+N]=R[i+j]=1; if(i==N-1) { print(A);cout< } else mytry(i+1,M,L,R,A); A[i][j]=0; M[j]=L[i-j+N]=R[i+j]=0; } return count; } void print(int A[N][N]) { int i,j;