USACO 3.2 Magic Squares
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: |
|
B: |
|
C: |
|
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的全排列数列进行判重和记录
所以就是引入一个“中介数”
好吧,继续那个运用好几次的例子了……来源是一本余姚的书……
- 首先这个排列的四个数的位置都是未知的:_ _ _ _
- 从左向右看中介数,第一个2表示4的右边有2个数比4小,则确定4的位置: _ 4 _ _
- 第二个2表示3的右边有2个比3小,则确定3的位置:3 4 _ _
- 第三个1表示2的右边有1个比2小,则确定2的位置:3 4 2 _
- 最后确定1的位置:3 4 2 1
/*
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的更多相关文章
- [hash-bfs]USACO 3.2 Magic Squares 魔板
魔 板 魔板 魔板 题目描述 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色 ...
- 洛谷 P2730 魔板 Magic Squares
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- [USACO3.2]魔板 Magic Squares
松下问童子,言师采药去. 只在此山中,云深不知处.--贾岛 题目:魔板 Magic Squares 网址:https://www.luogu.com.cn/problem/P2730 这是一张有8个大 ...
- 「一本通 1.4 例 2」[USACO3.2]魔板 Magic Squares
[USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...
- 840. Magic Squares In Grid (5月27日)
开头 这是每周比赛中的第一道题,博主试了好几次坑后才勉强做对了,第二道题写的差不多结果去试时结果比赛已经已经结束了(尴尬),所以今天只记录第一道题吧 题目原文 Magic Squares In Gri ...
- 洛谷 P2730 魔板 Magic Squares 解题报告
P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 ...
- 哈希+Bfs【P2730】 魔板 Magic Squares
没看过题的童鞋请去看一下题-->P2730 魔板 Magic Squares 不了解康托展开的请来这里-->我这里 至于这题为什么可以用康托展开?(瞎说时间到. 因为只有8个数字,且只有1 ...
- 3.2.5 Magic Squares 魔板
3.2.5 Magic Squares 魔板 成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方 ...
- 【简●解】 LG P2730 【魔板 Magic Squares】
LG P2730 [魔板 Magic Squares] [题目背景] 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 ...
随机推荐
- .Net Attribute详解(一)
.Net Attribute详解(一) 2013-11-27 08:10 by JustRun, 1427 阅读, 14 评论, 收藏, 编辑 Attribute的直接翻译是属性,这和Property ...
- poj3083走玉米地问题
走玉米地迷宫,一般有两种简单策略,遇到岔路总是优先沿着自己的左手方向,或者右手方向走.给一个迷宫,给出这两种策略的步数,再给出最短路径的长度. ######### #.#.#.#.# S....... ...
- 简单使用JSON,通过JSON 字符串来创建对象(二)
把 JSON 文本转换为 JavaScript 对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 Jav ...
- 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)
<Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...
- 安装Win8
老毛桃安装Win8(哪里不会点哪里,so easy) 先来一张美女图,是不是很漂亮呢!继续往下看! 求推荐啊! 对于一个干IT的码农来说,会写代码不算什么,会装系统不算什么,及会写代码也会装系统的那才 ...
- 分享一个自己写的MVC+EF “增删改查” 无刷新分页程序
分享一个自己写的MVC+EF “增删改查” 无刷新分页程序 一.项目之前得添加几个组件artDialog.MVCPager.kindeditor-4.0.先上几个效果图. 1.首先建立一个数 ...
- Python闭包详解
Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...
- 使用 javascript 来实现 观察者模式
以[猫叫.老鼠跑.主人醒]为例子,使用 javascript 来实现 观察者模式 (有在线演示) 2013-06-24 08:35 by 金色海洋(jyk)阳光男孩, 572 阅读, 4 评论, 收藏 ...
- win32多线程-重写消息循环
最近正在学习<win32多线程程序设计>,这是其中一段重写消息循环的代码事例,以后可能用的上. while (!quit || gNumPrinting > 0) { // Wait ...
- Linux编程之给你的程序开后门
这里说的"后门"并不是教你做坏事,而是让你做好事,搭建自己的调试工具更好地进行调试开发.我们都知道,当程序发生异常错误时,我们需要定位到错误,有时我们还想,我们在不修改程序的前提下 ...