java宽度优先搜索之八数码,宽度优先搜索解决八数码问题

本文详细介绍如何使用宽度优先搜索算法解决八数码问题,即在给定任意初始和目标九宫格布局的情况下,通过递归地寻找合法移动,实现从起始状态到目标状态的解决方案。代码示例展示了节点类定义、搜索过程及关键函数实现。
摘要由CSDN通过智能技术生成

41528d3028836879cd698677c3999917.gif宽度优先搜索解决八数码问题

解八数码问题:任意输入两个九宫格作为初始状态和目标状态,用宽度优先搜索求解。#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值