回溯与分支限界算法设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析实验报
告
1.骑士游历问题(采用回溯法):
在国际象棋的棋盘(8行×8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并
且每格只到达一次。
若给定起始位置(x0,y0),编程探索出一
条路径,沿着这条路径马能遍历棋盘上的所有单元格。
2. 行列变换问题(采用分支限界法):
给定两个m n方格阵列组成的图形A和图形B,每个方格的颜色为黑色或白色,如下图所示。
行列变换问题的每一步
变换可以交换任意2行或2列方格的颜色,或者将某行或某列
颠倒。
上述每次变换算作一步。
试设计一个算法,计算最少需
要多少步,才能将图形A变换为图形B。
图形A图形B
2. 行列变换问题的程序:
package .t8;
import java.util.LinkedList;
import java.util.Scanner;
class graph{
static int sour, dest;//sour是图形的初始整数,dest是图形的目的整数
static int ans[]=new int[1<<16];//静态变量(即全局变量),用于存放图形变换的路径
int m=4,n=4,x;
int row[]=new int[4];
int col[]=new int[4];
void setx(int x){
this.x=x;
}
int getx(){
return this.x;
}
void rowx(){//将一个整数划分成四行二进制
int y;
for(int i=0;i<m;i++){
y=1;
row[i]=0;
for(int j=0;j<n;j++){
if((x&1)!=0) //如果x的最低位是1
row[i]|=y;
y<<=1;
x>>=1;
}
}
}
}
实例:
总结实验心得体会:
掌握回溯法解决问题的一般步骤。
学会使用回溯法解决实际问题。
掌握分支限界法解决问题的基本思想。
学会使用分支限界法解决实际问题
改进意见:
对于分支限界法了解的不透彻,应与老师沟通解决此问题,回溯法可以帮我们更好的解决一些多解的复杂性问题,所以,要更好的去学习和运用回溯法思想。
实验成绩:指导教师:年月日。