网站做的好有什么用,青岛网站做网站多少钱,什么是网络营销?网络营销的常用方法有哪些?,营销型网站建设明细报价表文章目录 QuestionIdeasCode Question
在一个 33 的网格中#xff0c;1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。
例如#xff1a;
1 2 3 x 4 6 7 5 8 在游戏过程中#xff0c;可以把 x 与其上、下、左、右四个方向之一的数字交换#xff08;如果存… 文章目录 QuestionIdeasCode Question
在一个 3×3 的网格中1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。
例如
1 2 3 x 4 6 7 5 8 在游戏过程中可以把 x 与其上、下、左、右四个方向之一的数字交换如果存在。
我们的目的是通过交换使得网格变为如下排列称为正确排列
1 2 3 4 5 6 7 8 x 例如示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。
交换过程如下
1 2 3 1 2 3 1 2 3 1 2 3 x 4 6 4 x 6 4 5 6 4 5 6 7 5 8 7 5 8 7 x 8 7 8 x 现在给你一个初始网格请你求出得到正确排列至少需要进行多少次交换。
输入格式 输入占一行将 3×3 的初始网格描绘出来。
例如如果初始网格如下所示
1 2 3 x 4 6 7 5 8 则输入为1 2 3 x 4 6 7 5 8
输出格式 输出占一行包含一个整数表示最少交换次数。
如果不存在解决方案则输出 −1 。
输入样例 2 3 4 1 5 x 7 6 8 输出样例 19
Ideas
Code
#include iostream
#include cstring
#include algorithm
#include string
#include queue
#include unordered_mapusing namespace std;int bfs(string state){string ed 12345678x;queuestring q;unordered_mapstring, int dis;dis[state] 0;q.push(state);int dx[4] {0, 1, 0, -1};int dy[4] {1, 0, -1, 0};while(q.size() 0){string t q.front(); // 取队头q.pop(); // 删除队头int distance dis[t];int k t.find(x);int x k / 3, y k % 3;if (t ed) return distance;for (int i 0; i 4; i ){int a x dx[i];int b y dy[i];if (a 0 a 3 b 0 b 3){swap(t[a * 3 b], t[k]); // 交换字符串if (!dis.count(t)){dis[t] distance 1;q.push(t);}swap(t[a * 3 b], t[k]);}}}return -1;}int main(){string state;for (int i 0; i 9; i ){char c;cin c;state c;}cout bfs(state) endl;return 0;
}