简单八数码问题

/*
问题描述:
初始状态为:
1 2 3
4 5 6
7 8 0

输入最终状态,求初始状态到最终状态的步数;
如果步数小于等于5,则输出步数;否则输出-1
*/

#include "iostream"
#include "string"
#include "queue"
#include "vector"
#include "algorithm"
using namespace std;

const int direction[4][2] = { { 0, -1 }, { 0, 1 }, { -1, 0 }, { 1, 0 } };  //0移动的方向
const string init = "123456780"; //初始状态
const int num = 3;
struct Node{
	string state;
	int depth; //到这一节点的步数
	int zero; //0的位置
	Node(int d = 0, string s = "", int z = 8) :depth(d), state(s), zero(z){}
};

int main(int argc, char *argv[]){
	int t;
	cin >> t; //测试用例的个数
	while (t--){
		string target = ""; //目标状态
		for (int i = 0; i < num * num; i++){
			string tmp;
			cin >> tmp;
			target += tmp;
		}
		queue<Node> openList;
		vector<string> closeList; //存放访问过的状态
		openList.push(Node(0, init, 8));

		int depth = 0;
		bool flag = false;
		while (!openList.empty() && depth <= 5){
			Node head = openList.front();
			depth = head.depth;
			if (head.state == target){
				flag = true;
				break;
			}
			int oldr = head.zero / num; //0所在的行
			int oldc = head.zero % num; //0所在的列
			for (int i = 0; i < 4; i++){
				int newr = oldr + direction[i][0];
				int newc = oldc + direction[i][1];
				if (newr >= 0 && newr < num && newc >= 0 && newc < num){
					int newpos = newr * 3 + newc; //0的新位置
					string newstate = head.state;
					newstate[head.zero] = head.state[newpos];
					newstate[newpos] = '0';
					if (find(closeList.begin(), closeList.end(), newstate) == closeList.end())
						openList.push(Node(head.depth + 1, newstate, newpos));
				}
			}
			openList.pop();
			closeList.push_back(head.state);
		}
		if (flag){
			cout << depth << endl;
		}
		else{
			cout << -1 << endl; //1 2 3 4 5 0 7 8 6
			//2  3  4  1  5  0  7  6  8
		}
	}
	return 0;
}

时间: 2024-10-23 01:41:07

简单八数码问题的相关文章

1225 八数码难题

1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.问题描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765

洛谷【P1379】八数码难题

P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入输出格式 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊

八数码的八境界 [转载]

八数码的八境界   研究经典问题,空说不好,我们拿出一个实际的题目来演绎.八数码问题在北大在线测评系统中有一个对应的题,题目描述如下: Eight Time Limit: 1000MS    Memory Limit: 65536K  Special Judge Description The 15-puzzle has been aroundfor over 100 years; even if you don't know it by that name, you've seen it. I

洛谷OJ P1379 八数码难题 解题报告

洛谷OJ P1379 八数码难题 解题报告 by MedalPluS 题目描述   在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变.   输入格式   输入初试状态,一行九个数字,空格用0表示   输出格式 只有一行,该行只有一个数字,表示从初始状态到

康托展开与八数码问题

康托展开的公式是 X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,ai为当前未出现的元素中是排在第几个(从0开始). 举个例子来说明一下: 例如,有一个数组 s = ["A", "B", "C", "D"],它的一个排列 s1 = ["D", "B", "A", "C"],现在要把

HDU 1043 POJ 1077 八数码问题

以下内容转载自:http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 八数码的八境界 研究经典问题,空说不好,我们拿出一个实际的题目来演绎.八数码问题在北大在线测评系统中有一个对应的题,题目描述如下: Eight Time Limit: 1000MS    Memory Limit: 65536K  Special Judge Description The 15-puzzle has been aroundfor ove

洛谷 P1379 八数码难题

P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入输出格式 输入格式: 输入初始状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊

【算法】BFS+哈希解决八数码问题

15拼图已经有超过100年; 即使你不叫这个名字知道的话,你已经看到了.它被构造成具有15滑动砖,每一个从1到15上,并且所有包装成4乘4帧与一个瓦块丢失.让我们把丢失的瓷砖"X"; 拼图的目的是安排瓷砖以便它们排序为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15× 这里唯一合法经营是交流'X'与它共享一个边缘的瓷砖之一.作为一个例子,举动下列顺序解决了一个稍微加扰难题: 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8 5 6

多种方法求解八数码问题

AI的实验报告,改了改发上来.希望路过的大牛不吝赐教.非常是纳闷我的ida*怎么还没有双搜快.还有发现基于不在位启示的A*和Ida*都挺慢.尤其是ida* 搜索31步的竟然要十几秒.是我写的代码有问题吗?忘路过的大牛指导啊!!!! 另外声明一下,有些东西也是看网上各路牛人的blog学来的,因为比較杂,再次无法一一列出,总之再次感谢把自己的思考的结果放到网上与大家分享的大牛们.谢谢! 八数码问题 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每一个棋子上标有1至8的某一数字,不同棋子上标