• H 幻方变换(puzzle)(NYIST 2019年校赛)

如果一个 3 × 3 的矩阵中,整数 1-9 中的每个都恰好出现一次,我们称这个矩阵为一个幻 方。

我们可以对一个幻方进行一些操作。具体来说,我们可以

• 选择幻方的一行,整体向右移动一格,并将最右侧的数字移到最左边;或者

• 选择幻方的一列,整体向下移动一格,并将最下侧的数字移到最上面。

例如,下面两个操作分别是一种合法的行操作和列操作:

显然,一个合法的幻方经过一次操作后一定还是合法的幻方。

给定幻方的初始状态,请问,最少要经过多少次变换,才能变成最终状态?

输入描述:

第一行一个整数 T (1 ≤ T ≤ 200000),表示测试用例的数量。接下来有 T 组测试用例,每组测试用例前有一个空行。每组样例的前 3 行为幻方的初始状态,后 3 行为幻方的最终状态。每行的数字之间没有空格。保证初始状态和最终状态都是合法的幻方。

输出描述:

对于每组测试用例在一行内输出一个整数,表示答案。如果不可能从起始状态转变为最终状态,输出 impossible。

样例输入:

4123
456
789
231
456
789457
213
689
257
361
489927
641
358
297
651
384123
456
789
123
456
789

样例输出:

2
3
impossible
0

分析:

​ $广搜即可。不过因为是t组输入,即每一次广搜的最坏次数为9!,故每一次都广搜的话会超时 $

​ 我们可以预处理出123 456 789 到所有状态的的最小次数,然后对于题目要求输入的初始状态和最终状态,只需把初始状态对应位置的数字都对应为123 456 789,并且把最终状态的按照这种规则转化一下。那么只需求123 456 789这种状态到转换后的最终状态的最短距离即可。因为预处理了,可以O(1)时间内求出来。

故可分为下列步骤

  1. 预处理123 456 789到其他所有状态的最少操作次数(广搜即可)

    ​ 需要注意以下问题

    • 对于幻方的状态可以用每一行拼接后的字符串表示
    • 定义幻方旋转第iii行和旋转第iii列的操作
  2. 将输入的最初状态转换为123 456 789转换并记录下规则

  3. 将输入的最终状态按照 第二步 的规则转化为可以求的最终状态

  4. O(1)出答案即可

代码:

#include<bits/stdc++.h>
#define mset(a,b)   memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
struct HuanF{string s;int step;HuanF Row_right(int k)//第k行向右旋转{HuanF ans;ans.s=s;char c=ans.s[3*k+2];ans.s[3*k+2]=ans.s[3*k+1];ans.s[3*k+1]=ans.s[3*k];ans.s[3*k]=c;return ans;}HuanF  Colu_down(int k){HuanF ans;ans.s=s;char c=ans.s[k+6];ans.s[k+6]=ans.s[k+3];ans.s[k+3]=ans.s[k];ans.s[k]=c;return  ans;}void Print(){for(int i=0;i<s.length();++i){printf("%c%c",s[i],i%3==2?'\n':' ');}printf("step=%d\n",step);}
};
bool operator <(const HuanF &a ,const HuanF& b)
{return a.s<b.s;
}
map<HuanF,int> book;//记录有没有出现过
map<HuanF,int> dis;//记录最小值
void init()
{int times=0;HuanF now;now.s="123456789";now.step=0;queue<HuanF> mmp;mmp.push(now);book[now]=1;dis[now]=0;while(!mmp.empty()){HuanF mm=mmp.front();mmp.pop();for(int i=0;i<3;++i){HuanF Net=mm.Colu_down(i);if(!book[Net]){dis[Net]=mm.step+1;Net.step=mm.step+1;book[Net]=1;mmp.push(Net);}Net=mm.Row_right(i);if(!book[Net]){dis[Net]=mm.step+1;book[Net]=1;Net.step=mm.step+1;mmp.push(Net);}}}
}
int Hash[10];//将魔方中的数字 分别对应 1 2 3 4 5
int main()
{int t;init();scanf("%d",&t);char ss[10];char zz[10];while(t--){for(int i=0;i<3;++i){scanf("%s",ss+(i*3));}for(int i=0;i<9;++i){Hash[ss[i]-'0']=i+1;}for(int i=0;i<3;++i){scanf("%s",zz+(i*3));}for(int i=0;i<9;++i){zz[i]=Hash[zz[i]-'0']+'0';}zz[9]='\0';HuanF ret;ret.s=string(zz);if(ret.s!="123456789"&&dis[ret]==0){cout<<"impossible"<<endl;}elsecout<<dis[ret]<<endl;}return 0;
}

转载于:https://www.cnblogs.com/dchnzlh/p/10546538.html

H 幻方变换(puzzle)(NYIST 2019年校赛)相关推荐

  1. java 分班_J 分班(class)(NYIST 2019年校赛)

    J 分班(class)(NYIST 2019年校赛) 内存限制:256MB 时间限制:1s Special Judge: No 题目描述: jsb 是 XX 市第一中学的校长.一轮模拟考试结束后,js ...

  2. 2019电赛 H题-电磁炮 视觉部分

    2019电赛-H题-电磁炮-视觉自瞄部分; 硬件平台: Jetson Nano, Realsense D435 实现功能:识别到引导标志反馈坐标及距离,串口输出 #include <iostre ...

  3. 2019电赛总结(一)

    2019电赛总结(一) 文章目录 2019电赛总结(一) 4 那之前 5 电赛初期 6 电赛中期 7 电赛强化练习 8 电赛预热阶段8月初 9 那以后 4 那之前 2019电赛总结(序) 5 电赛初期 ...

  4. 2019电赛--OpenMV学习笔记

    此文章在我的博客链接:https://sublimerui.top/archives/f10b0e1a.html NOTES:2019电赛结束啦~辛辛苦苦4天后,现已经写成了针对题目的OpenMV总结 ...

  5. 2019电赛总结(序)

    2019电赛总结(序) 文章目录 2019电赛总结(序) 1 序 2 嵌入式与单片机省赛落败 3 电赛启航 4 PID简述 5 那之后 电赛的一些经验 1 序 鄙人于某工大集成电路设计专业就学,但电子 ...

  6. WHU校赛2019(网络赛) 解题报告(CCNU_你们好强啊我们都是面包手) Apare_xzc

    WHU校赛2019(网络赛) 解题报告 CCNU_你们好强啊我们都是面包手(xzc zx lj) 战况: 比赛时3题,排名57,现在5题了 题目链接: WHU校赛2019 <-戳这里 以下题目按 ...

  7. 倪文迪陪你学蓝桥杯2021寒假每日一题:2.1日(2019省赛A组第10题)

    2021年寒假每日一题,2017~2019年的省赛真题.本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供.每日一题,关注蓝桥杯专栏: https://blog.csdn.net/w ...

  8. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.26日(2019省赛A组第4题)

    2021年寒假每日一题,2017~2019年的省赛真题.本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供.每日一题,关注蓝桥杯专栏: https://blog.csdn.net/w ...

  9. 2019电赛纸张计数仪分析——————致敬“谢谢惠顾”

    2019电赛国赛还没出结果,但我感觉我应该是"成功参与"了. 就不给大家讲讲我们的方案----进行一波反思. 先看传感器我们用的fdc2214,没什么问题.问题出在了主控板上,我现 ...

  10. 2019电赛--无人机题目OpenMV总结

    此文章在我的博客链接:https://sublimerui.top/archives/d508d500.html NOTES:上一篇相关博文,准备阶段OpenMV学习笔记链接: https://blo ...

最新文章

  1. Babel 快速入门
  2. 阿里云虚拟主机数据库主机怎么看
  3. 生成JSON数据--官方方法
  4. html自动轮播计时器不准,用jQuery写的图片轮播为何停止定时器只能停止一次?...
  5. Extjs4 MVC 添加view层
  6. 操作系统习题——(习题二)
  7. 用fuser或者lsof解决无法umount问题(device is busy)
  8. 机器学习中常见的距离公式
  9. 在搜索框自动输入文本_selenium自动化测试之常见的定位元素
  10. ad系统安装配置指南(java-jndi-ldap),AD系统安装配置指南(JAVA-JNDI-LDAP-Exchange)
  11. Android中的异步处理技术之Thread
  12. 从 0 基础到 10w 册数据分析书籍的畅销书作家
  13. 汽车数字化零售优化全渠道体验
  14. python基础之布尔运算
  15. 记一次网页打印小票、收据
  16. android ip查看工具,安卓手机查看IP地址的两种方法
  17. 树莓派 teamviewer 使用代理服务器上网
  18. 网络爬虫--记一次有趣的侦察型反爬手段(ebay)
  19. JavaScript 判断浏览器类型及32位64位
  20. Nginx下载、安装与使用

热门文章

  1. 新手小白也看得懂的电脑win10安装教程
  2. FMS直播,在PC和手机PAD同时接收直播(使用RTMP和HLS协议)
  3. 手机看java源码软件_pin.java 源代码在线查看 - 一个专门为手机写的程序 资源下载 虫虫电子下载站...
  4. 有管网气体消防系统小知识来啦
  5. 国密SM2系列算法验证工具
  6. 腾讯全套人力资源管理资料大全(职位能力模型图+人力资源管理+招聘体系+培训体系+薪酬绩效+员工职业发展,共174M)
  7. 【LeetCode】求中位数(数据流、滑动窗口、两个正序数组)
  8. python算方差_Python求均值,方差,标准差的实例
  9. VeryCD将于本月关闭 P2P历史即将终结
  10. 树莓派怎么切换输入法_树莓派 Raspberry Pi 设置显示中文方法安装输入法