魔板
杭电OJ·1430
(http://acm.hdu.edu.cn/showproblem.php?pid=1430)

1 问题描述
在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:

1 2 3 4
8 7 6 5

对于魔板,可施加三种不同的操作,具体操作方法如下:

A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368

给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
2 输入
每组测试数据包括两行,分别代表魔板的初态与目态。
3 输出
对每组测试数据输出满足题意的变换步骤。
4 样例输入
12345678

17245368

12345678

82754631
5 样例输出
C

AC

6 问题分析
问题描述:设魔板问题可以用数字1,2,3,4,5,6,7,8表示方块的颜色序列,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:
1 2 3 4
8 7 6 5
而对于魔板,有三种操作:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
那么问题假设给出初态和目标状态,求多种变换方案则取字典序最小的那种。

数据结构设计:在这问题中,通过分析可以知道当A两次连续操作或者B四次连续操作还是C四次连续操作都会回到原来的数组,这样我们可以知道以上的情况都可能会导致死循环。
由于原始魔板数组通过若干A、B、C操作最终都可以得到目标魔板数组,所以我们需要设计方法限制最大的操作次数,如若大于限定的操作次数,停止操作,并清空当前操作序列结果,以免出现死循环。
定义数组存储,为避免不必要的参数栈,将此数组定义为全局变量,使用struct结构体存储模板数组。

算法思路:确定了存储方式之后,利用队列进行广度优先搜索,根据思考确定算法思路如下:
其实一开始看到题目就觉得是普通的BFS题目不过要用到HASH,这里还有一个关键点就是相对状态。一开始我就先按 12345678 这样的顺序建立了一棵像树一样的,如果直接从初态不进行转变的话,那么我们的结果可能有很多的走法,有可能是先走A或B都可以到目标,有多条路时,但是先走了B的路径,必须要输出小的也就是从A开始的那条路,那怎么办呢,就可以用转化的思想了,把初始状态变成12345678,这样的话,一开始就是从这样的顺序算出来的!所以必须先进行转换,在从目标往上找并记下路径,一直找到最终父节点:12345678。

算法分析说明:
(1)、for(i = 0; i<8; i++)
pos[start[i]-‘0’] = i+1;
for(i = 0; i<8; i++)
end[i] = pos[end[i]-‘0’];
int k;
的代码其实就是把初始状态看成1.2.3.4.5.6.7.8,然后进行替换。
(2)、例如:void A(string &s),ABC三种操作分别定义了方法,方法内解析成数组交换,将字符串s 中的字符顺序颠倒过来,每次颠倒一个输入行中的字符顺序。
(3)、在定义深搜的时候一定要将数组和结构体这种占用内存大的数据结构进行初始化。需要注意的是,题目要求的是从基本状态走向目标状态,而非还原操作。数据输入是顺时针的,正确把数据放入数组后,后续的三种操作都可以正常进行。

7 程序代码
将能够AC的代码放在文本框中,需要使用高亮代码时,可以使用NotePad++、Sublime等编辑器导出有高亮显示的代码到doc或者rtf文档,然后再将导出的代码复制到表格中。显然,规范的代码是编程人员的美德。
#include
using namespace std;

#include
#include

string start,end,ans[50000];
int hash[10],pos[10],vis[50000];

typedef struct // typedef创建新类型,可以用node作为类型声明新的结构体变量
{
string step,str;
int val;
}node;

int solve(string &s)
{
int i,j,sum = 0;
for(i = 0; i<7; i++)
{
int cnt = 0;
for(j = i+1; j<8; j++)
if(s[i]>s[j])
cnt++;
sum+=cnt*hash[7-i];
}
return sum;
}

void A(string &s)//上下两行互换
{
for(int i = 0; i<4; i++)
swap(s[i],s[i+4]);
}

void B(string &s)//每行同时循环右移一格
{
char t=s[3];
for(int i=2; i>=0; i–)
s[i+1]=s[i];
s[0]=t;
t=s[7];
for(int i=6; i>=4; i–)
s[i+1]=s[i];
s[4]=t;
}

void C(string &s)//中间4个方块顺时针旋转一格
{
char t=s[1];
s[1]=s[5];
s[5]=s[6];
s[6]=s[2];
s[2]=t;
}

void bfs()
{
memset(vis,0,sizeof(vis));//一定要将数组和结构体这种占用内存大的数据结构进行初始化,sizeof是vis数组或所占的字节个数。
node a,next; //node作为类型声明新的结构体变量
queue Q; //定义queue node结构体对象Q
a.step = “”;
a.str = start;
a.val = solve(start);
vis[a.val] = 1;
ans[a.val] = “”;
Q.push(a); //a入队
while(!Q.empty()) //判断队列非空
{
a = Q.front();//a最早被压入队列,首元素
Q.pop(); //a出队
string t;
int k;
t = a.str;
A(t);
k = solve(t);

    while(!vis[k]){vis[k] = 1;next = a;next.step+='A';ans[k] = next.step;next.str = t;next.val = k;Q.push(next);}t = a.str;B(t);k = solve(t);while(!vis[k]){vis[k] = 1;next = a;next.step+='B';ans[k] = next.step;next.str = t;next.val = k;Q.push(next);}t = a.str;C(t);k = solve(t);while(!vis[k]){vis[k] = 1;next = a;next.step+='C';ans[k] = next.step;next.str = t;next.val = k;Q.push(next);}
}

}

int main()
{
int i,j;
hash[0] = 1;
for(i = 1; i<10; i++)
hash[i] = hash[i-1]*i;
start = “12345678”;
bfs();
while(cin>>start>>end)
{
swap(start[4],start[7]);//
swap(start[6],start[5]);
swap(end[4],end[7]);
swap(end[6],end[5]);
for(i = 0; i<8; i++)
pos[start[i]-‘0’] = i+1;
for(i = 0; i<8; i++)
end[i] = pos[end[i]-‘0’];
int k;
k = solve(end);
cout << ans[k] << endl;
}
return 0;
}

8 测试示例


9 结果截图
将在线OJ上能够证明自己AC的截图放在这里。

10 解题备注
体会:
在开始做题的时候就觉得题目超出我的能力范围外,而且要写各种分析,这令我感觉要写很多文字,然后会不想去做。不过还好正是因为这样一步步地去分析,才让我逐步分析出来如何去完成一个由算法设计开始的程序的编写,倾力去完成这一道算法,虽然过程会去参考一下网上的代码,但是确实自己能够去理解算法,能融合自己的实力去分析思路,完成代码的编写。
编写经验:
一开始就要设计方法限制最大的操作次数,不然可能会出现死循环的情况,这样是无法将程序进行下去的。认证分析ABC三种操作如何实现,其实就是算法设计完成了一大半了,知道方法内解析成数组交换。而且在定义深搜的时候一定要将数组和结构体这种占用内存大的数据结构进行初始化。

HDOJ1430魔板相关推荐

  1. java51游戏_Java作业实践(一)魔板游戏

    课题:魔板游戏 一.课设要求 1.基本功能 (1)游戏规则 一个3×3的魔板,有一个格子是空的,其他格子内随机放置1-8共8个编号的方块,通过单击任意一个与空格子相邻的方块可以把该方块移入空格子,不断 ...

  2. P2730 魔板 Magic Squares

    不看题解肯定不会系列... 这道题可以用Cantor展开解决. Cantor展开可以求出一个数组是在全排列中的第几个. 具体怎么操作自己百度. Cantor展开的公式是:\(a[1] * (n - 1 ...

  3. 【题解】Luogu P2730 魔板

    蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...

  4. 洛谷P2730 [IOI]魔板 Magic Squares

    题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...

  5. Magic Squares 魔板 (BFS+HASH)

    Description 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8 ...

  6. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  7. hdu.1430.魔板(bfs + 康托展开)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  8. 魔板(洛谷-P2730)

    题目描述 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个 ...

  9. 魔板(信息学奥赛一本通-T1449)

    [题目描述] 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前 ...

  10. USACO 3.2 Magic Squares 魔板

    题目大意: 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8 ...

最新文章

  1. 《Advanced PHP Programming》读书笔记
  2. 怎么在Ubuntu Scope中获取location地址信息
  3. MySQL为表添加外键约束
  4. XmlHttpRequest 对象详解
  5. Java与C++进行系统间交互:Protocol Buffer
  6. Equals 和 == 的区别
  7. 如何限制对象只能建立在堆上或者栈上
  8. 如何将html转为report,如何使用XtraReport将报表导出为HTML
  9. 使用MyEclipse修改web项目名称
  10. 请问诸位大神,Android怎么实现图片转动
  11. [LeetCode] 144. Binary Tree Preorder Traversal Java
  12. oracle 主键自动地址实现
  13. Win7 启用 Telnet 功能
  14. 介绍一些预言性质的梦
  15. 三国古城和108将地图已恢复
  16. 嵌入式面试全攻略,记我的一次校招
  17. 一文入门 Spring Cloud Tencent
  18. 国学入门书要目及其读法----梁启超
  19. 网页导出Excel文件并下载
  20. MySQL常用函数大全详解

热门文章

  1. MongoDB UTC时间问题
  2. C++ | 计算圆周长面积、圆柱体积、圆球体积
  3. 如何设置代理服务器?
  4. python高级索引
  5. 如何用自己的电脑开WiFi热点
  6. 数据泵导入报错ORA-39125和LPX-00225
  7. 关于股票的经典书籍有哪些推荐?
  8. Linux安装无线网卡RTL8811CU
  9. ol4服务器连接不稳定,红警Online频繁掉线怎么办 总是断开链接问题解答
  10. Text file busy解决方法