深度宽度优先搜索 - 八数码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Y

八数码问题

具体思路:

宽度优先算法实现过程

(1)把起始节点放到OPEN表中;

(2)如果OPEN是个空表,则没有解,失败退出;否则继续;

(3)把第一个节点从OPEN表中移除,并把它放入CLOSED的扩展节点表中;

(4)扩展节点n。如果没有后继节点,则转向(2)

(5)把n的所有后继结点放到OPEN表末端,并提供从这些后继结点回到n的指针;

(6)如果n的任意一个后继结点是目标节点,则找到一个解答,成功退出,否则转向(2)。

深度优先实现过程

(1)把起始节点S放入未扩展节点OPEN表中。如果此节点为一目标节点,则得到一个解;(2)如果OPEN为一空表,则失败退出;

(3)把第一个节点从OPEN表移到CLOSED表;

(4)如果节点n的深度等于最大深度,则转向(2);

(5)扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。如果没有后裔,则转向(2);

(6)如果后继结点中有任一个目标节点,则得到一个解,成功退出,否则转向(2)。

方法

一:用C语言实现

#include

#include

#include

typedef long UINT64;

typedef struct

{

char x; //位置x和位置y上的数字换位

char y; //其中x是0所在的位置

} EP_MOVE;

#define SIZE 3 //8数码问题,理论上本程序也可解决15数码问题,

#define NUM SIZE * SIZE //但move_gen需要做很多修改,输入初始和结束状态的部分和check_input也要修改

#define MAX_NODE 1000000

#define MAX_DEP 100

#define XCHG(a, b) { a=a + b; b=a - b; a=a - b; }

#define TRANS(a, b)

/*{ long iii; (b)=0; for(iii=0; iii < NUM; iii++) (b)=((b) << 4) + a[iii]; }*/ //将数组a转换为一个64位的整数b

#define RTRANS(a, b) \

{ \

long iii; \

UINT64 ttt=(a); \

for(iii=NUM - 1; iii >= 0; iii--) \

{ \

b[iii]=ttt & 0xf; \

ttt>>=4; \

} \

} //将一个64位整数a转换为数组b

//

typedef struct EP_NODE_Tag

{ UINT64 v; //保存状态,每个数字占4个二进制位,可解决16数码问题struct EP_NODE_Tag *prev; //父节点

struct EP_NODE_Tag *small, *big;

} EP_NODE;

EP_NODE m_ar[MAX_NODE];

EP_NODE *m_root;

long m_depth; //搜索深度

EP_NODE m_out[MAX_DEP]; //输出路径

//

long move_gen(EP_NODE *node, EP_MOVE *move)

{long pz; //0的位置

UINT64 t=0xf;

for(pz=NUM - 1; pz >= 0; pz--)

{if((node->v & t) == 0)

{ break; //找到0的位置

}

t<<=4;

}

switch(pz) {case 0: move[0].x=0; move[0].y=1; move[1].x=0; move[1].y=3; return 2; case 1: move[0].x=1; move[0].y=0; move[1].x=1; move[1].y=2; move[2].x=1; move[2].y=4; return 3; case 2: move[0].x=2; move[0].y=1; move[1].x=2; move[1].y=5;

return 2; case 3: move[0].x=3; move[0].y=0; move[1].x=3; move[1].y=6; move[2].x=3; move[2].y=4; return 3; case 4: move[0].x=4; move[0].y=1; move[1].x=4; move[1].y=3; move[2].x=4; move[2].y=5; move[3].x=4; move[3].y=7; return 4; case 5: move[0].x=5; move[0].y=2; move[1].x=5;

move[1].y=4; move[2].x=5; move[2].y=8; return 3; case 6: move[0].x=6; move[0].y=3; move[1].x=6; move[1].y=7; return 2; case 7: move[0].x=7; move[0].y=6; move[1].x=7; move[1].y=4; move[2].x=7; move[2].y=8; return 3; case 8: move[0].x=8; move[0].y=5; move[1].x=8; move[1].y=7;

相关文档
最新文档