宽度优先搜索解决八数码问题
解八数码问题:任意输入两个九宫格作为初始状态和目标状态,用宽度优先搜索求解。#include#include#include#include#includeusing namespace std;class NineNode{public: int nine[3][3];//九宫格int parent;//父节点,根节点的父节点为-1int i;//空白所在行int j;//空白所在列string step;//从上一节点移动至此节点所需操作};bool havesolution(NineNode start,NineNode end);bool match(NineNode node1,NineNode node2);bool ishave(deque openQueue,vector closedList,NineNode node);int main(){int i,j;deque openQueue;//open 队列vector closedList;//closed 列表stack movepath;//移动步骤栈NineNode initilNode,lastNode;//初始节点和目标节点cout>initilNode.nine[i][j];if(0==initilNode.nine[i][j]){initilNode.i=i; initilNode.j=j;}}initilNode.parent=-1;/*输入初始节点状态 结束 */cout>lastNode.nine[i][j];if(0==lastNode.nine[i][j]){lastNode.i=i; lastNode.j=j;}}lastNode.parent=-1;/*输入目标节点状态 结束 */if(havesolution(initilNode,lastNode)){int parent=-1;//parent 指示父节点下标bool flag=false;//找到标志openQueue.push_back(initilNode);while((!openQueue.empty())temp=openQueue.front();openQueue.pop_front();closedList.push_back(temp);parent=closedList.size()-1;if(match(temp,lastNode)){flag=true;break;}if(temp.j>0)//向左移动{NineNode left=temp;left.nine[temp.i][temp.j]=left.nine[temp.i][temp.j-1];left.nine[temp.i][temp.j-1]=0;left.parent=parent;left.i=temp.i;left.j=temp.j-1;left.step=“向左移动“;if(!ishave(openQueue,closedList,left))openQueue.push_back(left);}if(temp.i>0)//向上移动{NineNode up=temp;up.nine[temp.i][temp.j]=up.nine[temp.i-1][temp.j];up.nine[temp.i-1][temp.j]=0;up.parent=parent;up.i=temp.i-1;up.j=temp.j;up.step=“向上移动 “;if(!ishave(openQueue,closedList,up))openQueue.push_back(up);}if(temp.j openQueue,vector closedList,NineNode node){bool result=false;deque::iterator qit=openQueue.begin();vector::iterator vit=closedList.begin();while(qit!=openQueue.end()){if(match(*qit++,node)){result=true;break;}}while(vit!=closedList.end()){if(match(*vit++,node)){result=true;break;}}return result;}/*判断给定的八数码问题是否有解 */bool havesolution(NineNode start,NineNode end){bool result=false;int i,j,count1=0,count2=0;int a[3*3];int b[3*3];for(i=0;i<3;i++)for(j=0;j<3;j++){if(start.nine[i][j]!=0)a[count1++]=start.nine[i][j];if(end.nine[i][j]!=0)b[count2++]=end.nine[i][j];}int rsum=0,tsum=0;for(i=0;i<8;i++)for(j=0;j