蓝桥杯 历届试题 九宫重排

问题描述
如下面第一个图的九宫格中,放着 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 }

 

转载于:https://www.cnblogs.com/hujunzheng/p/4345489.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java坦克大战源码下载

HJZGG: https://github.com/hjzgg/hjzgg_tank_java 解压之后运行可执行jar包即可&#xff01;效果图如下&#xff1a; v 1.游戏开始v 2.选择地图v 3.开始游戏v 4.游戏自定义转载于:https://www.cnblogs.com/hujunzheng/p/4348415.html

虚拟化服务器的管理与维,服务器虚拟化管理

服务器虚拟化管理 内容精选换一换为了解决Windows系统的源端服务器与目的端弹性云服务器的兼容性问题&#xff0c;您需要手动给目的端服务器安装相关驱动进行优化。登录管理控制台。选择“计算 > 弹性云服务器”。在弹性云服务器列表中&#xff0c;查看目的端服务器的规格。…

Myeclipse 操作数据库

步骤1&#xff1a;通过MyEclipse中的window-》show View-》other 调出。DB浏览器&#xff0c;和 SQL Results 步骤2. 可以右键单击空白处&#xff0c;选择new&#xff0c;创建一个新的DB connection&#xff0c; 或者edit已经存在的DB connection 步骤3&#xff1a;数据库信息填…

媒体服务器协议,媒体服务器介绍(mediactrl架构)

5.1.1MediaCtrl媒体控制草案MediaCtrl是IETF下专门研究和制定媒体服务器控制标准的小组&#xff0c;以SIP和XML为所制定标准的基础。这个工作组的工作包括&#xff1a;定义媒体服务器控制的技术需求说明、框架、控制协议簇和定位/连接协议。5.1.1.1技术需求描述这个技术需求描述…

android target unknown and state offline解决办法

没有错&#xff0c;将adb的版本升级一下就好了&#xff01; 下载地址为&#xff1a;http://files.cnblogs.com/files/hujunzheng/adb1.0.32.zip 转载于:https://www.cnblogs.com/hujunzheng/p/4360436.html

s2sh框架搭建(辅助工具:MyEclipse)及解决一些遇到的问题

1.新建一个web project 2.首先生成Hibernate Facet 3.Hibernate Facet 安装步骤 4.然后是spring facet安装步骤 5.最后是struts facet 的配置 6.最后的整体布局如下所示 7.在服务器上运行&#xff0c;发现如下错误&#xff1a; 严重: Exception sending context initialized ev…

520爱心表白——C语言入门

520爱心表白——C语言入门 关于爱心表白的代码&#xff0c;网上有很多非常好看而且可以实现颜色变换和立体&#xff0c;动态等效果的代码。但是我入门不久&#xff0c;能力有限。520重要的可能还是在心意我觉得&#xff0c;所以自己写了一个非常简单毫无技术含量爱心代码来表达…

c语言之结构

今天来说一下C语言里的结构体(struct)、共用体(l联合体)union、枚举。 欢迎加入嵌入式学习群&#xff1a;559601187 &#xff08;一&#xff09;结构体&#xff1a;struct 1.1 概念 是一种自定义的数据类型结构体是构造类型的一种不同数据类型的集合地址空间连续&#xff0c;…

C语言实现音乐播放器(Linux madplay)

&#xff08;一&#xff09;需求分析 1.扫描指定路径下的音乐&#xff0c;并显示出来 2.实现音乐的播放、暂停、上一首和下一首的功能 3.程序退出释放内存资源 &#xff08;二&#xff09;思路 1.扫描出指定路径下的音乐文件(便利指定文件夹&#xff0c;找出音频文件放在数组…

虚拟机中安装linux

&#xff08;一&#xff09;前言 就在昨天电脑的固态突然崩掉&#xff0c;无奈重新把系统装在的以前的硬盘上&#xff0c;为了能够继续工作重新配置嵌入式linux系统开发环境&#xff0c;本教程主要记录在虚拟机中安装linux。 &#xff08;二&#xff09;环境准备 虚拟机&…

Ubuntu设置root登录

1.、Ubuntu 管理员用户 root 默认没有密码&#xff0c;在使用前最好添加密码&#xff0c;使用指令&#xff1a; sudo passwd root 注意&#xff1a;命令行输入密码时不显示&#xff0c;输入时需注意密码的准确性&#xff1b; 2、Ubuntu 想要用 root 帐户登录&#xff0c;可在普…

vim配置之spacevim

为了更好的利用vim&#xff0c;我们一般需要自己配置&#xff0c;今天介绍了一下经常用的spacevim &#xff08;一&#xff09;配置环境 Ubuntu16.04vim 7.4版本以上(必须&#xff01;&#xff01;) &#xff08;二&#xff09;安装spacevim 1.检查vim的版本&#xff1a; v…

Ubuntu更换gnome桌面环境后不能root登录

安装完Ubuntu后感觉界面有点丑陋&#xff0c;安装了gnome桌面环境试一下 sudo apt-get install gnome-shell sudo apt-get install ubuntu-gnome-desktop如果选择了lightdm后可以使用sudo dpkg-reconfigure gdm3 重新改回gdm3 sudo apt-get install unity-tweak-tool sudo ap…

Ubuntu下安装tilix终端仿真器

安装环境 Ubuntu 16.04 操作步骤 首先添加这个终端模拟器仓库的公钥。这里我都是以root超级用户权限操作的&#xff0c;如果没有的话&#xff0c;请在命令前面加sudo。 add-apt-repository ppa:webupd8team/terminixapt update安装Tilix。 apt install tilix安装完成测试结…

vim配置之snippets代码块

&#xff08;一&#xff09;目的 我们在编写程序的过程中&#xff0c;经常会敲一些重复的代码&#xff0c;我们可以利用snippets来达到输入简写来敲出完整的代码 &#xff08;二&#xff09;安装步骤 安装使用Vundle,没有vbundle的先执行下面的命令 git clone https://gith…

c语言实现跳动的心

本文章分为两部分&#xff1a;第一部分为实现多彩的心&#xff0c;第二部分是实现心得跳动&#xff0c;两个代码均独立运行 本篇文章转载自公众号&#xff1a; C语言程序设计基础知识 &#xff08;一&#xff09;C语言实现多彩的心 实现过程其实很简单 首先使用for循环绘制心…

Linux下使用消息队实现 ATM 自动取款机功能

文章分五部分&#xff1a;需求分析、项目所需知识点、思路讲解、代码实现、功能演示 本文内容较长&#xff0c;建议是按照我自己的思路给大家讲解的&#xff0c;如果有其他问题&#xff0c;欢迎评论区讨论 文章中的代码是在linux下编译实现的&#xff0c;注意自己的环境。 &…

200行代码实现视频人物实时去除

今天在GitHub上发现了一个好玩的代码&#xff0c;短短几百行代码就实现了从复杂的背景视频中去除人物&#xff0c;不得不说这位大佬比较厉害。 这个项目只需要在网络浏览器中使用JavaScript&#xff0c;用200多行TensorFlow.js代码&#xff0c;就可以实时让视频画面中的人物对…

codeforces C. Vanya and Scales

C. Vanya and ScalesVanya has a scales for weighing loads and weights of masses w0, w1, w2, ..., w100 grams where w is some integer not less than 2(exactly one weight of each nominal value). Vanya wonders whether he can weight an item with mass m using …

菱形继承和虚继承、对象模型和虚基表

1.菱形继承&#xff08;钻石继承&#xff09;&#xff1a;两个子类继承同一父类&#xff0c;而又有子类同时继承这两个子类。例如B,C两个类同时继承A&#xff0c;但是又有一个D类同时继承B,C类。 2.菱形继承的对象模型 class A { public:int _a; };class B :public A { p…