Magic Squares
IOI'96

Following the success of the magic cube, Mr. Rubik invented its planar version, called magic squares. This is a sheet composed of 8 equal-sized squares:

1 2 3 4
8 7 6 5

In this task we consider the version where each square has a different color. Colors are denoted by the first 8 positive integers. A sheet configuration is given by the sequence of colors obtained by reading the colors of the squares starting at the upper left corner and going in clockwise direction. For instance, the configuration of Figure 3 is given by the sequence (1,2,3,4,5,6,7,8). This configuration is the initial configuration.

Three basic transformations, identified by the letters `A', `B' and `C', can be applied to a sheet:

  • 'A': exchange the top and bottom row,
  • 'B': single right circular shifting of the rectangle,
  • 'C': single clockwise rotation of the middle four squares.

Below is a demonstration of applying the transformations to the initial squares given above:

A:
8 7 6 5
1 2 3 4
B:
4 1 2 3
5 8 7 6
C:
1 7 2 4
8 6 3 5

All possible configurations are available using the three basic transformations.

You are to write a program that computes a minimal sequence of basic transformations that transforms the initial configuration above to a specific target configuration.

PROGRAM NAME: msquare

INPUT FORMAT

A single line with eight space-separated integers (a permutation of (1..8)) that are the target configuration.

SAMPLE INPUT (file msquare.in)

2 6 8 4 5 7 3 1

OUTPUT FORMAT

Line 1: A single integer that is the length of the shortest transformation sequence.
Line 2: The lexically earliest string of transformations expressed as a string of characters, 60 per line except possibly the last line.

SAMPLE OUTPUT (file msquare.out)

7
BCABCCB

——————————————————

就喜欢usaco题面一复制就下来了

8!很容易想到的是搜索,我们需要对一个长为8的全排列数列进行判重和记录

所以就是引入一个“中介数”

好吧,继续那个运用好几次的例子了……来源是一本余姚的书……

通过中介数(221)↑构造排列的过程如下:
  1. 首先这个排列的四个数的位置都是未知的:_ _ _ _
  2. 从左向右看中介数,第一个2表示4的右边有2个数比4小,则确定4的位置: _ 4 _ _
  3. 第二个2表示3的右边有2个比3小,则确定3的位置:3 4 _ _
  4. 第三个1表示2的右边有1个比2小,则确定2的位置:3 4 2 _
  5. 最后确定1的位置:3 4 2 1
同时可以知道,3421这个排列的序号是2*3!+2*2!+1*1!+0=17。
而且每个序号对应唯一的排列,我们知道一个排列求序号就可以了,所以就愉快的解决了
然后浅谈一下我的意识流:
对于一个全排列数列,也就是1234-4321,按字典序依次。
还是对于3421,3后面有两个数比它小,1在第一位时有3!个全排列,2在第一位时有3!个全排列,所以3421在这个数列的位置一定在2*3!之后在3*3!之前。
4后面有2个比它小,因为3这一位固定了,那么它之前会有3 1 打头的2!个排列,3 2 打头的2!个全排列,它在2*3!+2*2!个数之后
2后面有1个比它小,3 4 2 都固定了,那么也就是3 4 2 打头的1!个全排列即它本身。
所以映射了唯一的编号,我们就可以做题了。
 
这道题输出格式两点注意:
1是字母60个一行要换行
2是它给出的串是顺时针念的(A sheet configuration is given by the sequence of colors obtained by reading the colors of the squares starting at the upper left corner and going in clockwise direction. For instance, the configuration of Figure 3 is given by the sequence (1,2,3,4,5,6,7,8). This configuration is the initial configuration.)
例如题目中的:
1234
8765
如果给出一个描述就是12345678
所以样例中的描述是
2684
1375
当然这样并不舒服,所以我们把它的格式强行改成两排横着念就好了
 /*
ID: ivorysi
PROG: msquare
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#define siji(i,x,y) for(int i=(x);i<=(y);++i)
#define gongzi(j,x,y) for(int j=(x);j>=(y);--j)
#define xiaosiji(i,x,y) for(int i=(x);i<(y);++i)
#define sigongzi(j,x,y) for(int j=(x);j>(y);--j)
#define inf 0x7fffffff
#define MAXN 400005
#define ivorysi
#define mo 97797977
#define ha 974711
#define ba 47
#define fi first
#define se second
//#define pis pair<int,string>
using namespace std;
typedef long long ll;
int fac[]={,,,,,,,,};
int num(int x) {
int ss[],l=;
while(x>) {ss[++l]=x%;x/=;}
int ret=;
siji(i,,l) {
int x=;
xiaosiji(j,,i) {
if(ss[j]<ss[i]) ++x;
}
ret+=x*fac[i];
}
return ret;
}
int cha1(int x) {
int ss[],l=;
while(x>) {ss[++l]=x%;x/=;}
siji(i,,) swap(ss[i],ss[i+]);
int ret=;
gongzi(i,,) ret=ret*+ss[i];
return ret;
}
int cha2(int x) {
int ss[],l=;
while(x>) {ss[++l]=x%;x/=;}
int ss1[];
siji(i,,) swap(ss[i],ss[-i+]);
ss1[]=ss[];
siji(i,,) ss1[i]=ss[i-];
ss1[]=ss[];
siji(i,,) ss1[i]=ss[i-];
int ret=;
siji(i,,) ret=ret*+ss1[i];
return ret;
}
int cha3(int x) {
int ss[],l=;
while(x>) {ss[++l]=x%;x/=;}
siji(i,,) swap(ss[i],ss[-i+]);
int t=ss[];
ss[]=ss[];ss[]=ss[];ss[]=ss[];ss[]=t;
int ret=;
siji(i,,) ret=ret*+ss[i];
return ret;
}
int ys[];
int mut[],step[],prev[],ans[],cnt;
int to;
char *str="$ABC";
queue<int> q;
void bfs() {
q.push();
mut[num()]=;
while(!q.empty()) {
int now=q.front();q.pop();
if(now==to) break;
int z=cha1(now);
int w=num(z);
if(mut[w]==) {
mut[w]=mut[num(now)]+;
step[w]=;
prev[w]=num(now);
q.push(z);
}
z=cha2(now);
w=num(z);
if(mut[w]==) {
mut[w]=mut[num(now)]+;
step[w]=;
prev[w]=num(now);
q.push(z);
}
z=cha3(now);
w=num(z);
if(mut[w]==) {
mut[w]=mut[num(now)]+;
step[w]=;
prev[w]=num(now);
q.push(z);
}
} }
void solve() { siji(i,,) {
scanf("%d",&ys[i]);
}
siji(i,,) to=to*+ys[i];
gongzi(i,,) to=to*+ys[i];
bfs();
printf("%d\n",mut[num(to)]-);
int k=num(to);
while(step[k]!=) {
ans[++cnt]=step[k];
k=prev[k];
}
gongzi(i,cnt,) {
printf("%c",str[ans[i]]);
if((cnt-i+)%==) puts("");
}
puts("");
}
int main(int argc, char const *argv[])
{
#ifdef ivorysi
freopen("msquare.in","r",stdin);
freopen("msquare.out","w",stdout);
#else
freopen("f1.in","r",stdin);
#endif
solve();
}

哦还想起来一个老师让我刷但是我特别不想刷的一个界面特别不友好特别有那种盗版的感觉但是老师说它好的oj上有这道题。

一段很长的空白之后……

出题人是没有刷过USACO吗……

虽然有点小开心呢但还是要说出题人别闹了这道题还是挺水的如果知道中介数的话……

USACO 3.2 Magic Squares的更多相关文章

  1. [hash-bfs]USACO 3.2 Magic Squares 魔板

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

  2. 洛谷 P2730 魔板 Magic Squares

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

  3. [USACO3.2]魔板 Magic Squares

    松下问童子,言师采药去. 只在此山中,云深不知处.--贾岛 题目:魔板 Magic Squares 网址:https://www.luogu.com.cn/problem/P2730 这是一张有8个大 ...

  4. 「一本通 1.4 例 2」[USACO3.2]魔板 Magic Squares

    [USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...

  5. 840. Magic Squares In Grid (5月27日)

    开头 这是每周比赛中的第一道题,博主试了好几次坑后才勉强做对了,第二道题写的差不多结果去试时结果比赛已经已经结束了(尴尬),所以今天只记录第一道题吧 题目原文 Magic Squares In Gri ...

  6. 洛谷 P2730 魔板 Magic Squares 解题报告

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

  7. 哈希+Bfs【P2730】 魔板 Magic Squares

    没看过题的童鞋请去看一下题-->P2730 魔板 Magic Squares 不了解康托展开的请来这里-->我这里 至于这题为什么可以用康托展开?(瞎说时间到. 因为只有8个数字,且只有1 ...

  8. 3.2.5 Magic Squares 魔板

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

  9. 【简●解】 LG P2730 【魔板 Magic Squares】

    LG P2730 [魔板 Magic Squares] [题目背景] 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 ...

随机推荐

  1. DotNetOpenAuth搭建OAuth2.0

    使用DotNetOpenAuth搭建OAuth2.0授权框架 标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物 ...

  2. asp.net 的一个简单进度条功能

    我们先看下效果 我点击了按钮后他会显示进度页面,进度完成后,进度条消失,其实也是比较简单的了. 我们需要一个进度条代码文件ProgressBar.htm(注意:是没有head这些标签的) <sc ...

  3. 百度云语音识别,Audio2Txt(c#)

    百度云识别没有提供c#版本的sdk,下面给个c#的 1.打开网址http://developer.baidu.com/ 2.登陆 3.管理控制台>开发者服务管理 4.创建工程 5.输入名称,点击 ...

  4. Sublime和Codeblocks支持C++11

    Sublime和Codeblocks支持C++11 闲来没事看了一下C++11,比起C++0x多了很多新功能,像auto变量,智能指针等,g++4.7以上版本也提供了对C++11的支持,但是,如何在你 ...

  5. HTML5小游戏UI美化版

    HTML5小游戏[是男人就下一百层]UI美化版 之前写的小游戏,要么就比较简单,要么就是比较难看,或者人物本身是不会动的. 结合了其它人的经验,研究了一下精灵运动,就写一个简单的小游戏来试一下. 介绍 ...

  6. win8商店应用验证,二进制文件是在调试模式下生成的解决方案。

    程序是在release模式下生成的,并且arm和x64通过了验证,但是x86就出现了这个奇葩问题. 搞了半天发现是要把“优化代码”的选项勾上.

  7. Ajax实现天气预报功能

    实现天气预报功能 闲来无聊,写下此文 经常看见很多网站上有那种天气预报功能,自己之前也写过一个,不过属于那种涉及WCF服务引用那种,今天发现一个更为简单的方式来实现,使用Javascript和Ajax ...

  8. Memcache的一些学习

    Memcache的一些学习 首先,Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动 ...

  9. Bitmap的读写

    Bitmap的读写和几个小儿科的滤镜效果~ 闲来玩玩图像处理,拿破仑说过:“不想自己实现滤镜的美工不是好程序员~~#@!*^...#&!@......”  因为在学校做过很多美工的工作,而且从 ...

  10. 国外大师给PHP初学者的8条建议

    学习一门新语言可能会是一件很艰巨的任务,最好的办法就是借鉴前辈的经验已达到事半功倍,下面就是为php新手们准备的一些经验餐. 1.从OOP开始Naramore是SourceForge员工以及PHPWo ...