题目链接:http://acm.swust.edu.cn/problem/1126/

Time limit(ms): 1000      Memory limit(kb): 65535

上一周里,患有XX症的哈特13成功解决了填数矩阵问题。
不知道他这一周又从哪儿弄来一神奇的矩阵,于是逃课潜心研究了一周,终于发现了其中的奥秘:
该矩阵有2行、4列,即8个小方块,每个小方块上有一个数字,即:
1 2 3 4
5 6 7 8
对于这个神奇的矩阵,有3种变换方式,具体如下:
变换A:上下两行数字互换,如上图可变为:
5 6 7 8
1 2 3 4
变换B:每行同时向右循环移动一格,如上图可变为:
4 1 2 3
8 5 6 7
变换C:中间4个方块顺时针旋转90度,如上图可变为:
1 6 2 4
5 7 3 8

哈特13虽然发现了这些变换规则,但是他并不知道怎么解决如下问题:
现在给出一个初始状态和目标状态,怎么变换才能使得矩阵从初始状态变为目标状态且变换步数最少。如果有多种变换方案,输出变换序号字典序最小的那种方案。
请你帮助他。

Description

多组输入,约1000组,直到文件末尾。
每组数据包括4行,前两行为初始状态,后两行为目标状态。

Input

对于每组输入,输出满足要求的变换方案。

Output
  

1234
5678
5738
1624
Sample Input
  

CA
Sample Output
Sorry,由于OJ原因,换行请用\r\n
 
解题思路:直接从初始状态按照3种变换规则BFS,找到达到每个排列状态下的矩阵的最短路径(最少变换次数)找到对应状态下的一个序列值
     (就相当于8个数全排列,直接找这是第几个排列),然后在string 数组中把每个状态的答案存贮了,到时候直接按照状态查找就是
     值得注意的是每个状态下对应的记录数组的下标怎么找(这里有代码和详解:http://www.cnblogs.com/zyxStar/p/4563936.html)
注意:这里有一个坑点,那就是给出的初始序列不一定是12345678,我们需要将其对应过来(wa了n次),具体的看代码吧~~~
 
 #include<iostream>
#include<cstring>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef struct{
string path, mpt;
}node;
int vis[];
int cur[] = { , , , , , , , , , };
//依次为1的阶乘,2的阶乘。。。。。8各数在一个数位置确定时剩余 7! 种排列情况,以此类推
string opera[];
/****************************************** 寻找对应状态下对应数字编号!!!!
查找 "当前数" 确定情况下剩下的 "排列"
C(n 1)*(n-i)! 当前数状确定态下的排列种数, 依次递推到最后一位叠加,
每一个状态有且只有一个数对应 *********************************************/
int get_num(string x){
int i, j, a, b, cnt = , book[];
memset(book, , sizeof(book));
for (i = ; i < ; i++){
a = x[i] - '', b = ;
for (j = ; j < a; j++){
if (!book[j])
b++;
}
cnt += b*cur[ - i];
book[a] = ;
}
return cnt + ;
}
void bfs(){
queue<node>Q;
node now, next;
now.mpt = "", now.path = "";
Q.push(now);
vis[get_num(now.mpt)] = ;
while (!Q.empty()){
now = Q.front();
Q.pop();
opera[get_num(now.mpt)] = now.path;
for (int i = ; i < ; i++){
next = now;
if (!i){
next.path += 'A';
swap(next.mpt[], next.mpt[]);
swap(next.mpt[], next.mpt[]);
swap(next.mpt[], next.mpt[]);
swap(next.mpt[], next.mpt[]);
}
else if (i == ){
next.path += 'B';
char s1 = next.mpt[];
for (int j = ; j > ; j--)
next.mpt[j] = next.mpt[j - ];
next.mpt[] = s1;
char s2 = next.mpt[];
for (int j = ; j > ; j--)
next.mpt[j] = next.mpt[j - ];
next.mpt[] = s2;
}
else{
next.path += 'C';
swap(next.mpt[], next.mpt[]);
swap(next.mpt[], next.mpt[]);
swap(next.mpt[], next.mpt[]);
}
if (!vis[get_num(next.mpt)]){
vis[get_num(next.mpt)] = ;
Q.push(next);
}
}
}
}
int main(){
bfs();
string x1, x2, y1, y2;
while (cin >> x1 >> x2 >> y1 >> y2){
x1 += x2, y1 += y2;
pair<char, char>change[];
for (int i = ; i <= ; i++){
change[i].first = x1[i - ];
change[i].second = i + '';
}
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++){
if (y1[i - ] == change[j].first){
y1[i - ] = change[j].second;
break;
}
}
cout << opera[get_num(y1)] << "\r\n";
//cout << y1;
}
return ;
}

[Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)的更多相关文章

  1. [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)

    题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  2. [Swust OJ 715]--字典序问题(组合数预处理/数位dp)

    题目链接:http://acm.swust.edu.cn/problem/715/ Time limit(ms): 1000 Memory limit(kb): 65535   在数据加密和数据压缩中 ...

  3. [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)

    题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  4. BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!

    绝世污题,垃圾题,浪费我一整天青春! 1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1262 ...

  5. bzoj2396: 神奇的矩阵

    与51nod1140一样.不过这题是多组数据的...坑.... #include<cstdio> #include<cstring> #include<cctype> ...

  6. HDU 3567 Eight II BFS预处理

    题意:就是八数码问题,给你开始的串和结束的串,问你从开始到结束的最短且最小的变换序列是什么 分析:我们可以预处理打表,这里的这个题可以和HDU1430魔板那个题采取一样的做法 预处理打表,因为八数码问 ...

  7. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  8. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

  9. 神奇的矩阵 NOI模拟题

    神奇的矩阵 题目大意 有一个矩阵\(A\),第一行是给出的,接下来第\(x\)行,第\(y\)个元素的值为数字\(A_{x-1,y}\)在\(\{A_{x-1,1},A_{x-1,2},A_{x-1, ...

随机推荐

  1. 织梦dedecms|文章页通用标签

    当前位置: {dede:field name='position'/}上一页: {dede:prenext get='pre'/}下一页:    {dede:prenext get='next'/}收 ...

  2. 什么是RAW?

    RAWRAW是一个PHP网站开发系统,使用简单.快捷,核心功能是通过模版组合网站,模版可以自由开发,使开发者不再受传统开发的那种头晕限制,只需要通过填写表单即可完成网站的开发.此外,开发者还可以通过开 ...

  3. 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本、内核、当前时间

    申请博客有一段时间了,然而到现在还一篇没有写过..... 主要因为没有想到需要写些什么,最近在学习Python语言,照着书上看了看最基础的东西,发现根本看不进去,而且光看的话今天看了觉得都理解懂了,过 ...

  4. Linux中fork()函数详解(转)

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  5. C#使用系统的“显示桌面”功能(Shell.Application)

    原文 C#使用系统的“显示桌面”功能(Shell.Application) 在 Windows 系统的 任务栏 上的 快速启动栏 里,通常有一个图标  ,点击这个图标,就会切换到桌面.这个图标实际是一 ...

  6. Python的安装和详细配置(转)

    Python是一种面向对象.解释型计算机程序设计语言.被认为是比较好的胶水语言.至于其他的,你可以去百度一下.本文仅介绍python的安装和配置,供刚入门的朋友快速搭建自己的学习和开发环境.本人欢迎大 ...

  7. ORACLE模拟一个数据文件坏块并使用RMAN备份来恢复

    1.创建一个实验用的表空间并在此表空间上创建表 create tablespace blocktest datafile '/u01/oradata/bys1/blocktest.dbf' size ...

  8. hdoj 2544 最短路(最短路+Dijkstrea算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路分析:该问题给定一个无向图,要求求从起始点到终点的最短路径长度:可以使用dijkstra算法 ...

  9. Java中volatile的作用以及用法

    volatile让变量每次在使用的时候,都从主存中取.而不是从各个线程的“工作内存”. volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正 ...

  10. c 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 (MD花了半天时间,思路不对害死人)

    输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 比如: 输入: 输出: 输入: 输出: #include<stdio.h> int main(void) { ...