问题描述
如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。

我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
输入格式
输入第一行包含九宫的初态,第二行包含九宫的终态。
输出格式
输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3
样例输入
13524678.
46758123.
样例输出
22
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 #define N 20005
 9 using namespace std;
10
11 char mp[3][3], gp[3][3];
12 int dir[4][2] = {0,1, 1,0, -1,0, 0,-1};
13 char str[10];
14 struct node{
15     int x, y;
16     int step;
17     char cur_mp[3][3];//记录当前图案
18     node(){
19     }
20     node(int x, int y, int step){
21         this->x = x;
22         this->y = y;
23         this->step = step;
24     }
25 };
26 set<int>st;
27 queue<node>q;
28 bool check(node cur){
29     for(int i=0; i<3; ++i)
30         for(int j=0; j<3; ++j)
31             if(cur.cur_mp[i][j] != gp[i][j])
32                 return false;
33     return true;
34 }
35
36 int cal(node cur){//每一次移动将会映射到一个不同的整数
37     int ss = 0;
38     for(int i=0; i<3; ++i)
39         for(int j=0; j<3; ++j)
40             if(cur.cur_mp[i][j] != '.')
41                 ss = ss*10+(cur.cur_mp[i][j]-'0');
42             else ss = ss*10+9;
43     return ss;
44 }
45
46 void bfs(){
47     st.clear();
48     if(!q.empty())
49         st.insert(cal(q.front()));
50     while(!q.empty()){
51         node cur = q.front();
52         q.pop();
53         if(check(cur)) {
54             cout<<cur.step<<endl;
55             return ;
56         }
57
58         for(int i=0; i<4; ++i){
59             int xx = cur.x+dir[i][1];
60             int yy = cur.y+dir[i][0];
61             if(xx<0 || xx>2 || yy<0 || yy>2) continue;
62             node nt = node(xx, yy, cur.step+1);
63             memcpy(nt.cur_mp, cur.cur_mp, sizeof(cur.cur_mp));
64             nt.cur_mp[cur.x][cur.y]^=nt.cur_mp[xx][yy];
65             nt.cur_mp[xx][yy]^=nt.cur_mp[cur.x][cur.y];
66             nt.cur_mp[cur.x][cur.y]^=nt.cur_mp[xx][yy];
67             int val = cal(nt);
68             if(st.find(val) != st.end()) continue;
69             st.insert(val);
70             q.push(nt);
71         }
72     }
73     cout<<-1<<endl;
74 }
75
76 int main() {
77     while(cin>>str){
78         int bx, by;
79         while(!q.empty()) q.pop();
80         int len = 0;
81         for(int i=0; i<3; ++i)
82             for(int j=0; j<3; ++j){
83                 mp[i][j] = str[len++];
84                 if(mp[i][j] == '.') bx=i, by=j;
85             }
86         node cur = node(bx, by, 0);
87         memcpy(cur.cur_mp, mp, sizeof(mp));
88         q.push(cur);
89         cin>>str;
90         len = 0;
91         for(int i=0; i<3; ++i)
92             for(int j=0; j<3; ++j)
93                 gp[i][j] = str[len++];
94         bfs();
95     }
96     return 0;
97 }

本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/4345489.html,如需转载请自行联系原作者

蓝桥杯 历届试题 九宫重排相关推荐

  1. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  2. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  3. java九宫排序,蓝桥杯 历届试题 九宫重排 java

    list = new ArrayList(); list.add(new Move(x1,y1,0,start));//添加初始状态进入list set.add(start);//添加初始字符串进入s ...

  4. [蓝桥杯][历届试题]九宫重排-双向bfs和map标记

    题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  5. 蓝桥杯 历届试题 九宫重排

    问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  6. 蓝桥杯历届试题-九宫重排

    题目描述 如下面第一个图的九宫格中,放着  1~8  的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为: ...

  7. python 九宫重排_[蓝桥杯][历届试题]九宫重排 (Python代码)(bfs+集合)

    ac代码..可是官网还有两组没过.. ```python from collections import deque class Node(): def __init__(self, arr, ste ...

  8. 蓝桥杯 历届试题 九宫幻方

    问题描述   小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. 三阶幻方 ...

  9. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

最新文章

  1. VB中DateDiff 函数解释
  2. AS3汉字sokcet传送编码问题
  3. git部署与基本命令汇总
  4. 什么变量在堆内存里存放,什么变量在栈内存里存放
  5. 看了本书《答案在你心中》里面的很多问题都蛮有意思!!!
  6. 微信公众号开发自动回复的Python库——werobot
  7. Delphi中destroy, free, freeAndNil, release用法和区别
  8. python网址编码转换_刚学python,抓中文网页遇到编码的问题,怎么转换也不行……...
  9. 优动漫PAINT--草地教程
  10. Docker搭建Jenkins2.60.3版本,及更换jenkins下载源
  11. 《Python参考手册》3 类型与对象
  12. 计算机保研面试知识点,保研面试(附面试笔试机试)
  13. SpringCloudAlibaba——Nacos实现原理详解
  14. 跟我学在高德地图——标注我的位置
  15. 利用ECharts在线生成图表
  16. 【java】除法,除数后缀
  17. 腾讯技术工程 2019 年十大最受欢迎文章出炉!
  18. ThinkServer RD640 上安装redhat企业版6.5
  19. 饿了么UI 开关跟多文本编辑,下拉
  20. 笔记本电脑计算机限制,笔记本电脑网速限制

热门文章

  1. python菜鸟教程函数-Python
  2. redis中的quicklist
  3. redis中的zset
  4. mybatis中缓存的设计与原理
  5. LeetCode Best Time to Buy and Sell Stock(dp)
  6. shell中的变量及运算符
  7. 二分查找(递归和非递归)
  8. python学习之面向对象(三)
  9. 【Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) A】Palindrome Dance
  10. 关于一致性hash详细