回溯与分支限界算法c语言,回溯与分支限界算法设计.docx

算法设计与分析实验报告

专业

班级

姓名

学号

实验名称

实验四:回溯与分支限界算法设计

实验目的

掌握回溯法解决问题的一般步骤。

学会使用回溯法解决实际问题。

掌握分支限界法解决问题的基本思想。

学会使用分支限界法解决实际问题。

骑士游历问题(采用回溯法):

在国际象棋的棋盘(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)!=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值