个人备案 网站名称 例子市政公司宣传册设计样本
个人备案 网站名称 例子,市政公司宣传册设计样本,康乐县网站建设,区块链开发工程师要求问题描述#xff1a; 在33的棋盘上#xff0c;摆有八个棋子#xff0c;每个棋子上标有1至8的某一数字。棋盘中留有一个空格#xff0c;空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是#xff1a; 给出一种初始布局#xff08;初始状态#xff09;和目标布…问题描述 在3×3的棋盘上摆有八个棋子每个棋子上标有1至8的某一数字。棋盘中留有一个空格空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是 给出一种初始布局初始状态和目标布局设目标状态为123804765找到一种最少步骤的移动方法实现从初始布局到目标布局的转变。
输入
输入初始状态一行九个数字空格用0表示
输出
只有一行该行只有一个数字表示从初始状态到目标状态需要的最少移动次数(一定能到达目标状态)
样例输入
283104765样例输出
4解题思路 这题与八数码问题I-bfs和map标记的区别就是输入方式换了这样子输入有种情况比如028137465(随便举的例子),由于第一个元素是0所以我们用%去最后面的元素的时候我们取不到0所以我们用另外一种方式取每次取第一个元素将输入的数除以100000000就可以得到第一个元素然后%10得到就好了。
代码如下
#include iostream
#include queue
#include map
using namespace std;
mapint, intdis;
mapint, intvis;
int e 123804765;
int n;
int mp[4][4];
int ans;
int dx[] {0, 0, 1, -1}, dy[] {1, -1, 0, 0};
int r, c;void fff1(int t) {int div 100000000;for (int i 0; i 3; i)for (int j 0; j 3; j) {mp[i][j] (t / div) % 10;if (mp[i][j] 0) {r i;c j;}div div / 10;}
}int fff2() {int tmp 0;for (int i 0; i 3; i)for (int j 0; j 3; j) {tmp tmp * 10 mp[i][j];}return tmp;
}int dbfs(int s) {if (s e)//一开始就是终止状态就直接返回0return 0;vis[s] 1;//从起点开始搜标记为1vis[e] 2;//从终点开始搜标记为2dis[s] 0, dis[e] 1;//这里终点距离为1很容易想到是因为什么想不到可以留言我来帮你解答queueintq1, q2;q1.push(s);q2.push(e);while (q1.size() q2.size()) {bool flag 0;int t ;int v;if (q1.size() q2.size()) {t q1.front();q1.pop();flag 1;} else {t q2.front();q2.pop();flag 0;}fff1(t);for (int i 0; i 4; i) {int xx r dx[i], yy c dy[i];if (xx 0 xx 3 yy 0 yy 3) {swap(mp[xx][yy], mp[r][c]);v fff2();if (!dis.count(v)) {dis[v] dis[t] 1;vis[v] vis[t];if (flag)q1.push(v);elseq2.push(v);//相遇} else if (vis[v] vis[t] 3) {ans dis[v] dis[t];return ans;}swap(mp[xx][yy], mp[r][c]);}}}return -1;
}int main() {cin n;cout dbfs(n) endl;return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90682.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!