`

八数码问题 宽度优先遍历 状态压缩 双端遍历

阅读更多

 

#include<iostream>
#include<map>
using namespace std;
typedef struct
{
	int x;
	int w;
	char s;
}aaa;
map<int,int>a;
aaa dui[1000000],du[1000000];//两个队列
char www[1000000];
int main()
{
	int i,j;
	int many,ji,ji1,zan,zan2,x,y,tt,ww,ta,wa,q;
	int fang1[4][2]={-1,0,0,-1,1,0,0,1};//方向数组
	int fang2[4][2]={0,-1,-1,0,0,1,1,0};//方向数组
	int jin[9]={100000000,10000000,1000000,100000,10000,1000,100,10,1};
	char w[3][3];
	while(cin>>w[0][0])
	{
		cin>>w[0][1]>>w[0][2];
		for(i=1;i<3;i++)
			for(j=0;j<3;j++)
				cin>>w[i][j];
		many=0;
		char w2[9];
		for(i=0;i<3;i++)
			for(j=0;j<3;j++)
				w2[many++]=w[i][j];
		many=0;
		for(i=0;i<9;i++)
			for(j=0;j<i;j++)
				if((w2[i]<w2[j])&&w2[i]!='x'&&w2[j]!='x')
					many+=1;
		if(many%2==1)
		{
			printf("unsolvable\n");
			return(0);
		}
		int e,s;
		s=0;
		for(i=0;i<3;i++)
			for(j=0;j<3;j++)
			{
				if(w[i][j]!='x')s=10*s+w[i][j]-'0';
				else s=10*s+9;
			}
		tt=ww=ta=wa=1;
		e=123456789;
		dui[ww].w=s;
		du[wa].w=e;
		a[s]=1;
		a[e]=2;
		bool neng=false;
		if(s==e)neng=true;
		while(!neng)
		{
			ji=0;
			ji1=0;
			for(i=0;i<9;i++)
				if((dui[tt].w/jin[i])%10==9)
				{
					ji=i;
					break;
				}
			for(i=0;i<9;i++)
				if((du[ta].w/jin[i])%10==9)
				{
					ji1=i;
					break;
				}
			for(i=0;i<4;i++)
			{
				x=ji/3;
				y=ji%3;
				if(x+fang1[i][0]<3&&x+fang1[i][0]>=0&&y+fang1[i][1]<3&&y+fang1[i][1]>=0&&neng==false)
				{
					s=dui[tt].w;
					zan=s/jin[ji];
					zan2=s/jin[(x+fang1[i][0])*3+(y+fang1[i][1])];
					zan=zan%10;
					zan2=zan2%10;
					s=s-zan*jin[ji]-zan2*jin[(x+fang1[i][0])*3+(y+fang1[i][1])];
					s=s+zan2*jin[ji]+zan*jin[(x+fang1[i][0])*3+(y+fang1[i][1])];
					if(a[s]!=1)
					{
						if(a[s]==2)neng=true;
						a[s]=1;
						ww+=1;
						dui[ww].w=s;
						dui[ww].x=tt;
						if(i==0)dui[ww].s='u';
						if(i==1)dui[ww].s='l';
						if(i==2)dui[ww].s='d';
						if(i==3)dui[ww].s='r';
					}
				}
				x=ji1/3;
				y=ji1%3;
				if(x+fang2[i][0]<3&&x+fang2[i][0]>=0&&y+fang2[i][1]<3&&y+fang2[i][1]>=0&&neng==false)
				{
					s=du[ta].w;
					zan=s/jin[ji1];
					zan2=s/jin[(x+fang2[i][0])*3+(y+fang2[i][1])];
					zan=zan%10;
					zan2=zan2%10;
					s=s-zan*jin[ji1]-zan2*jin[(x+fang2[i][0])*3+(y+fang2[i][1])];
					s=s+zan2*jin[ji1]+zan*jin[(x+fang2[i][0])*3+(y+fang2[i][1])];
					if(a[s]==0)
					{
						a[s]=2;
						wa+=1;
						du[wa].w=s;
						du[wa].x=ta;
						if(i==0)du[wa].s='r';
						if(i==1)du[wa].s='d';
						if(i==2)du[wa].s='l';
						if(i==3)du[wa].s='u';
					}
				}
			}
			ta+=1;
			tt+=1;
		}
		ji=0;
		q=ww;
		while(q!=1)
		{
			ji+=1;
			www[ji]=dui[q].s;
			q=dui[q].x;
		}
		for(i=ji;i>=1;i--)printf("%c",www[i]);
		ji=0;
		q=1;
		while(du[q].w!=dui[ww].w)q++;
		while(q!=1)
		{
			ji+=1;
			www[ji]=du[q].s;
			q=du[q].x;
		}
		for(i=1;i<=ji;i++)printf("%c",www[i]);
		printf("\n");
		while(!a.empty())a.erase(a.begin());
	}
	return(0);
}

 

1
6
分享到:
评论

相关推荐

    通过广度优先遍历解决八数码问题

    通过广度优先遍历解决八数码问题 在计算机科学和人工智能领域中,对于搜索问题的解决方法有很多,广度优先遍历(Breadth-First Search,BFS)是一种常用的方法。八数码问题(Eight Puzzle)是一种经典的搜索问题,...

    抓取策略Web信息检索与数据抓取宽度优先遍历策略PPT资料.pptx

    抓取策略Web信息检索与数据抓取宽度优先遍历策略PPT资料 本资源摘要信息主要介绍了抓取策略Web信息检索与数据抓取宽度优先遍历策略的相关知识点。下面是本资源摘要信息的详细内容: 一、抓取策略的定义 抓取策略...

    图的遍历 深度优先遍历 宽度优先遍历

    以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 [实现提示] 设图的结点不超过30个,每个结点用一个编号表示(如果...

    图的深度优先遍历和广度优先遍历算法

    "图的深度优先遍历和广度优先遍历算法" 图的深度遍历和广度遍历是两个重要的算法,这也是我们理解并掌握图这一数据结构的基础。通过此程序算法可以进一步掌握图的构造以及遍历的相关知识。 图的深度优先遍历算法 ...

    无向图建立、深度优先遍历和广度优先遍历实现算法[借鉴].pdf

    无向图建立、深度优先遍历和广度优先遍历实现算法 本文将详细介绍无向图的建立、深度优先遍历和广度优先遍历的实现算法。这些算法是数据结构中非常重要的内容,掌握它们对后续学习和应用非常重要。 一、无向图的...

    抓取策略web信息检索与数据抓取宽度优先遍历拓展PPT资料.pptx

    宽度优先遍历策略在Web信息检索和数据抓取中扮演着重要的角色,它是网络爬虫进行网页抓取的一种有效方法。该策略主要针对网络数据的采集,旨在高效地遍历和处理互联网上的信息。本篇内容将深入探讨宽度优先遍历策略...

    图的创立数据结构对其进行深度优先遍历和广度优先遍历

    在本文中,我们将深入探讨图的数据结构以及如何对图进行深度优先遍历(DFS)和广度优先遍历(BFS)。首先,我们要理解图的基本概念。图是一种数据结构,用于表示对象之间的关系,其中的对象称为顶点或节点,而它们...

    迷宫问题-广度优先遍历

    广度优先遍历是一种用于遍历或搜索树或图的算法,它从根节点开始,沿着树的宽度优先遍历所有节点。在迷宫问题中,我们把迷宫视为一个图,每个可通行的格子看作一个节点,相邻的格子之间有边相连。以下是利用BFS解决...

    二叉树遍历流程图(先序、中序、后序、宽度遍历)

    二叉树遍历是计算机科学中处理树结构数据时常用的一种技术,主要分为四种类型:先序遍历、中序遍历、后序遍历和宽度优先遍历。这些遍历方法各有特点,适用于不同的场景。 1. **先序遍历**: - **递归实现**:先...

    图的深度优先遍历与广度优先遍历(C语言实现)

    5. **求解游戏状态**:例如解决八皇后问题或棋盘游戏的状态搜索。 **C语言实现** 在C语言中,可以通过邻接矩阵或邻接表来表示图,然后结合栈或队列实现DFS和BFS。在实际编程中,需要考虑如何存储顶点、边以及访问...

    建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc

    "建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历" 本文档主要介绍了图的存储方式,包括邻接矩阵和邻接表两种存储方法,并在此基础上实现了图的深度优先遍历和广度优先遍历。 一、图...

    图的深度优先遍历和广度优先遍历

    ### 图的深度优先遍历和广度优先遍历:核心概念与实现 #### 图的遍历算法概述 在数据结构中,图是一种重要的非线性数据结构,它由顶点集合V和边集合E组成,表示实体之间的关系。图的遍历是指按照某种策略访问图中...

    数据结构实验3.4:以邻接表为存储结构的图的深度、宽度优先遍历.doc

    数据结构实验报告主要探讨了如何使用邻接表作为存储结构来实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。在计算机科学中,图是一种表示对象间关系的数据结构,邻接表是高效存储无向图或有向图的一种方式,它...

    图的深度、广度优先遍历(c语言)

    ### 图的深度、广度优先遍历(C语言) #### 概述 本文将详细介绍如何在C语言中实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。这两种遍历方法是图论中最基本且重要的算法之一,在解决实际问题时有着广泛的...

    Graph1_非递归算法进行深度优先遍历和广度优先遍历_

    本话题主要探讨如何使用非递归算法对无向图进行深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),这两种遍历方法在图算法中有着广泛的应用。 **1. 邻接表表示法** 在处理大...

    通过广度优先遍历、深度优先遍历实现八数码项目

    在八数码问题中,BFS从初始状态开始,逐层扩展所有可能的下一状态,直到找到目标状态。BFS通常能保证找到最短的解决方案,因为它总是先探索距离起点近的状态。在C#中实现BFS,我们可以使用队列数据结构来存储待处理...

    图的深度优先和广度优先遍历

    图的深度优先和广度优先遍历 本文主要讨论图的深度优先遍历和广度优先遍历的算法实现,包括获取图的所有边、输出邻接矩阵、图的深度遍历和广度优先遍历的实现。 获取图的所有边 在获取图的所有边时,我们需要定义...

    图的遍历,包括深度优先和广度优先遍历

    在这个主题下,我们将深入探讨深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),以及在树结构中常见的先序、中序和后序遍历。这些遍历方法各有其特点,适用于不同的问题场景。...

    图的存储与深度优先与广度优先遍历

    深度优先遍历适用于寻找路径问题,而广度优先遍历则更适合最短路径问题。邻接表的使用不仅使得存储更为紧凑,也极大地提高了遍历效率。此外,这两种遍历方式也为解决更复杂的问题提供了基础框架,例如拓扑排序、最短...

Global site tag (gtag.js) - Google Analytics