解题思路:
3种扩展方式而已


参考代码:

#include <iostream>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <queue>

#define x first
#define y second

using namespace std;

unordered_map<string, int> dist;
unordered_map<string, pair<char, string>> pre;
string st = "12345678", ed, res;

string move0(string s)
{
	for (int i = 0; i < 4; i++) swap(s[i], s[7-i]);
	return s;
}

string move1(string s)
{
	for (int i = 0; i < 3; i++) swap(s[3], s[i]);
	for (int i = 4; i < 7; i++) swap(s[i], s[i+1]);
	return s;
}

string move2(string s)
{
	swap(s[1], s[2]), swap(s[5], s[6]), swap(s[1], s[5]);
	return s;
}

void bfs()
{
	queue<string> q;
	q.push(st);
	dist[st] = 0;
	while (!q.empty())
	{
		string t = q.front();
		q.pop();
		if (t == ed) return ;
		string m[3];
		m[0] = move0(t);
		m[1] = move1(t);
		m[2] = move2(t);
		for (int i = 0; i < 3; i++)
			if (!dist.count(m[i])) 
			{
				q.push(m[i]);
				dist[m[i]] = dist[t] + 1;
				pre[m[i]] = {'A' + i, t}; // second经过first操作到达m[i] 
			}
	}
}

int main()
{
	for (int i = 1; i <= 8; i++)
	{
		char ch;
		cin >> ch;
		ed += ch;
	}
	bfs();
	cout << dist[ed] << endl;
	if (dist[ed])
	{
		while (ed != st)
		{
			res += pre[ed].x;
			ed = pre[ed].y;
		}
		reverse(res.begin(), res.end());
		cout << res << endl;
	}
	return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论