七讲搜索.pptVIP

  • 0
  • 0
  • 约1.15万字
  • 约 60页
  • 2017-03-25 发布于上海
  • 举报
七讲搜索

一位顾客要预定一张从New York到Los Angeles的航班机票,下面是航班线路,请你为顾客找一种购票方案。 ??一位顾客要预定一张从New York到Los Angeles的航班机票,下面是航班线路,请你为顾客找一种购票方案。 程序设计实习2007 * 程序设计实习2007 * 问题中存在 程序设计实习2007 * 程序设计实习2007 * 何时? 程序设计实习2007 * 栈的实现 程序设计实习2007 * 状态空间的图结构 程序设计实习2007 * acm 程序设计实习2007 * 栈的大小 程序设计实习2007 * bool Bfs(int nStatus) { int nNewStatus; nQHead = 0; nQTail = 1; MyQueue[nQHead] = nStatus; while ( nQHead != nQTail) { //队列不为空 nStatus = MyQueue[nQHead]; if( nStatus == nGoalStatus ) {//找到目标状态 return true; } for( int i = 0;i 4;i ++ ) { //尝试4种移动 nNewStatus = NewStatus(nStatus,sz4Moves[i]); if( nNewStatus == -1 ) continue; //不可移,试下一种移法 int nByteNo = nNewStatus / 8; int nBitNo = nNewStatus % 8; if( GetBit( szFlag[nByteNo],nBitNo)) continue; //如果扩展标记已经存在, //则不能入队 //设上已扩展标记 SetBit( szFlag[nByteNo],nBitNo,1); //新节点入队列 MyQueue[nQTail] = nNewStatus; anFather[nQTail] = nQHead; //记录父节点 //记录本节点是由父节点经什么动作而来 szMoves[nQTail] = sz4Moves[i]; nQTail ++; }//end for nQHead ++; }//end while return false; } int main(){ nGoalStatus = NineToTen(123456780); memset(szFlag,0,sizeof(szFlag)); char szLine[50]; char szLine2[20]; cin.getline(szLine,48); int i,j; //将输入的原始字符串变为九进制字符串 j = 0; for( i = 0; szLine[i]; i ++ ) { if( szLine[i] != ) { if( szLine[i] == x ) szLine2[j++] = 0; else szLine2[j++] = szLine[i]; } } szLine2[j] = 0; if( Bfs(NineToTen(szLine2))) { int nMoves = 0; int nPos = nQHead; do { szResult[nMoves++] = szMoves[nPos]; nPos = anFather[nPos]; } while( nPos); for( int i = nMoves -1; i = 0; i -- ) { cout szResult[i]; } } else cout unsolvable endl; } 用深搜解决本题不好。如用递归实现,不作特殊处理的话,很容易就导致递归层数太多而栈溢出。 可以不写递归,自己用大数组实现一个栈。这可以避免栈溢出。但是可能导致输出结果的步数太多(几万步),这样交到POJ上会 Output limit exceeded 如果运气很坏,也可能数组会不够用。 用深搜解决八数码问题 深度优先搜索举例 void Queen( int n) {//摆放第n行以及以后的皇后(行号从0开始算) if( n == QueenNum ) { //前QueenNum行都成功摆好了,记下摆法 memcpy(anResult[nFoundNum++],anQueen,sizeof(anQueen));

文档评论(0)

1亿VIP精品文档

相关文档