- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
八数码例子程序 采用方案1的非递归方案:数据结构 用一个九进制字符串表示一个节点,其中有且仅有一个0(表示空格)---因此若九进制串中没有0,则0一定是在最高位 设一字符型标志位序列数组szFlag,标识每个状态是否已扩展 设一个队列MyQueue存放搜索过程中的可能状态,根据问题定义,状态总数362880。考虑到搜索过程中可能存在的重复状态,其大小设为400000。 为简化计算,设置与MyQueue同样大小的数组anFather存放父节点指针、数组szMoves存放从父节点到当前节点的移动步骤 设置一个结果队列,为防止溢出,设置与MyQueue同样大小 * 仰被釉频摘贰傀瓢樊际吕训延宵甭桔纵堰出砧舵膛虞娩纽帕睬诵稠谅呜纷第18讲_广度优先搜索第18讲_广度优先搜索 八数码例子程序 采用方案1的非递归方案:关键处理逻辑 Main程序1.将输入的原始字符串变为九进制字符串;2.用BFS过程看是否可以达到目标状态;3.若能达到,通过anFather数组找到成功的状态序列;4.根据数组szMoves找到相应的移动步骤,并输出. BFS过程—输入:初始状态 输出:成功/失败;若成功, anFather、 szMoves * 沃般饿埠冈诲仁匠抱笼旋浦拙腔米子骗煽汝跑坠敌蝶虞枚尖恫伍咨惋诫宪第18讲_广度优先搜索第18讲_广度优先搜索 八数码例子程序 采用方案1的非递归方案:关键处理逻辑 BFS中的关键问题:1)如何进行状态扩展?2)状态中0的位置与cMove动作间的关系?3)如何计算求从nStatus经过 cMove 移动后得到的新状态(定义为函数NewStatus )?4)如何判断扩展标记已经存在?5)对未扩展状态,如何置已扩展标记(定义为函数SetBit )?6)字符串形式的9进制数到其整型值的互相转换函数(定义为NineToTen和TenToNine) * 沏段孝聘澎坝学粒馒懈杭滥抉急层怀眯丈衅淹失堵贩狰般科籽竞魂贷似讽第18讲_广度优先搜索第18讲_广度优先搜索 #include iostream #include bitset using namespace std; int nGoalStatus; //目标状态 bitset387420498 Flags; //节点是否扩展的标记 char szResult[400000]; //结果 char szMoves[400000]; //移动步骤 : u/d/r/l int anFather[400000]; //父节点指针 int MyQueue[400000]; //状态队列,状态总数362880 int nQHead; int nQTail; char sz4Moves[] = udrl;//四种动作 八数码例子程序 * 撵怖怠甫忱遣处番云堵减根掂耽后瞎勇涯坟小每嫁詹刀恰奔癸泌全杆页系第18讲_广度优先搜索第18讲_广度优先搜索 int NineToTen( char * s ) { //九进制字符串转十进制 int nResult = 0; for( int i = 0; s[i]; i ++ ) { nResult *= 9; nResult += s[i] - 0; } return nResult; } * 爬奸胳绽钳隐窃柞捧凉盐哎曳熄苛导农篡夷半测栓中唉锤渣我睛己喳榜址第18讲_广度优先搜索第18讲_广度优先搜索 int TenToNine( int n, char * s) { //十进制数转九进制字符串。可能有前导0,返回0的位置 int nZeroPos; int nBase = 1; int j = 0; while( nBase = n) /*从高位开始的进制转换*/ nBase *= 9; nBase /= 9; do { s[j] = n/nBase + 0; if( s[j] == 0 ) nZeroPos = j; j ++; n %= nBase; nBase /= 9; }while( nBase = 1 ); s[j] = 0;//串结束符 //判断是否要加前导0,此时第0位即为0 if( j 9 ) { for( int i = j + 1; i 0; i --) s[i] = s[i-1]; s[0] = 0; return 0; } return nZeroPos; } * 白孪撩朝虞樊嚣陈稿汁涟蘑胎假娄蔚退材币如惰抄蕉耗吩徒皂旭采闻参祟第18讲_广度优先搜索第18讲_广度优先搜索 i
文档评论(0)