蓝桥杯 历届试题 九宫重排
我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
123.46758
46758123.
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 }
蓝桥杯 历届试题 九宫重排相关推荐
- 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- java九宫排序,蓝桥杯 历届试题 九宫重排 java
list = new ArrayList(); list.add(new Move(x1,y1,0,start));//添加初始状态进入list set.add(start);//添加初始字符串进入s ...
- [蓝桥杯][历届试题]九宫重排-双向bfs和map标记
题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- 蓝桥杯 历届试题 九宫重排
问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...
- 蓝桥杯历届试题-九宫重排
题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为: ...
- python 九宫重排_[蓝桥杯][历届试题]九宫重排 (Python代码)(bfs+集合)
ac代码..可是官网还有两组没过.. ```python from collections import deque class Node(): def __init__(self, arr, ste ...
- 蓝桥杯 历届试题 九宫幻方
问题描述 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. 三阶幻方 ...
- 算法笔记_183:历届试题 九宫重排(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...
最新文章
- VB中DateDiff 函数解释
- AS3汉字sokcet传送编码问题
- git部署与基本命令汇总
- 什么变量在堆内存里存放,什么变量在栈内存里存放
- 看了本书《答案在你心中》里面的很多问题都蛮有意思!!!
- 微信公众号开发自动回复的Python库——werobot
- Delphi中destroy, free, freeAndNil, release用法和区别
- python网址编码转换_刚学python,抓中文网页遇到编码的问题,怎么转换也不行……...
- 优动漫PAINT--草地教程
- Docker搭建Jenkins2.60.3版本,及更换jenkins下载源
- 《Python参考手册》3 类型与对象
- 计算机保研面试知识点,保研面试(附面试笔试机试)
- SpringCloudAlibaba——Nacos实现原理详解
- 跟我学在高德地图——标注我的位置
- 利用ECharts在线生成图表
- 【java】除法,除数后缀
- 腾讯技术工程 2019 年十大最受欢迎文章出炉!
- ThinkServer RD640 上安装redhat企业版6.5
- 饿了么UI 开关跟多文本编辑,下拉
- 笔记本电脑计算机限制,笔记本电脑网速限制