算法设计与分析实验报告
专业
班级
姓名
学号
实验名称
实验四:回溯与分支限界算法设计
实验目的
掌握回溯法解决问题的一般步骤。
学会使用回溯法解决实际问题。
掌握分支限界法解决问题的基本思想。
学会使用分支限界法解决实际问题。
骑士游历问题(采用回溯法):
在国际象棋的棋盘(8行X 8列)上放置一个马,按照“马走 日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并 且每格只到达一次。若给定起始位置(x0,y0),编程探索出一 条路径,沿着这条路径马能遍历棋盘上的所有单元格。
2.行列变换问题(采用分支限界法):
实验内容给定两个m n方格阵列组成的图形 A和图形B,每个方格的 颜色为黑色或白色,如下图所示。行列变换问题的每一步变 换可以交换任意2行或2列方格的颜色,或者将某行或某列颠 倒。上述每次变换算作一步。试设计一个算法,计算最少需 要多少步,才能将图形A变换为图形B。
实验内容
图形A图形B
图形A
1.骑士游历问题的解题思路或算法思想:
如果在每步选择方向时,不是任意选择一个方向,而是经过
一定的测试和计算,“预见”每条路的“宽窄”,再选择一
条最“窄”的路先走,成功的可能性较大。理由是先走“困
难的路”,光明大道留在后面。因为每一格迟早都要走到,
与其把困难留在后面,不如先走“困难的路”,这样路就会
越走越宽,成功的机会就越大。这种方法称为预见算法。
算法描述
为母个力|口」测定一个值可通路数,仑表小该位直上还有
多少条通路。在每一格上对8个方向都进行试探,并分析比
较,下一步应该选择可通路数值最小的方向走。
2.行列变换问题的解题思路或算法思想:
先进先出队列式分支限界法
输入数据,将计算出的最少变换次数和相应的变换序列输出。」
第1行是最少变换次数。从第2行开始,每行用4个数表小
一次变换。
程序及运行结果
1.骑士游历问题的程序:
package ;
import
public class Qishi (
private boolean Travel(int firstX, int firstY, int皿 board) (
ength; j++) {
if (board[i]田 < 10) {
""+ board[i][j]);
} else {
}
"");
}
}
}
实例:
输入起始点(。-7);
游历完成;
41
14
43
46
25
16
27
2
44
5S
49
3S
1
24
17
13
42
45
58
47
26
3
28
弱
63
54
39
关
37
10
23
53
12
57
43
59
21
29
4
G4
g
62
51
36
49
32
19
11
52
7
66
21
34
5
30
8
61
19
3S
6
31
20
33
2.行列变换问题的程序:
package ;
import 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)(
=x;
}
int getx()(
return ;
}
void rowx()(//将一个整数划分成四行二进制
int y;
for(int i=0;i
y=1;
row[i]=0;
for(int j=0;j
if((x&1)!=0) //如果x的最低位是1
row[i]|=y;
y<<=1;
x>>=1;
}
}
}
void colx(){//将一个整数划分成四列二进制
int y;
for(int j=0;j
y=1;
for(int i=0;i
for(int j=0;j
if((x&1)!=0) //如果x的最低位是1
col[j]|=y;
x>>=1;
}
y<<=1;
}
}
void rowy()(//将四行二进制转换成一个整数
int z=1, x=0, y;
for(int i=0;i
y=row[i];
for(int j=0;j
if((y&1)!=0) //如果y的最低位是1 x|=z;
z<<=1;
y>>=1;
}
}
=x;
}
void coly(){//将四列二进制转换成一个整数
int z=1, x=0,-y;
for(int i=0;i
for(int j=0;j
if((col[j]&1)!=