【USACO 3.2】Magic Squares
题意
4*2个格子分别为
1234
8765
的魔板有3种操作,A:上下两排互换,B:最后一列放到第一列前面,C:中间四个顺时针旋转1格。
现在给出目标状态,找出最少步数可从原始状态到达目标状态,且输出最小字典序的操作序列。
题解
bfs,全排列编码判重可以用康托展开,也可以用vis[8][8][8][8][8][8][8]来判重,因为第八位是固定的,所以要开\(8^7\)的空间。
代码
/*
USER:19flipp1
TASK:msquare
LANG:C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define in(s) freopen(#s".in","r",stdin);freopen(#s".out","w",stdout);
#define N 10
using namespace std;
int a[N],fac[N];
struct node{
int a[N];
int d;
char s[25];
}nd;
bool vis[320000];
int cantor(int a[N]){
int ans=0,c;
for(int i=1;i<8;i++){
c=0;
for(int j=i;j<=8;j++)if(a[i]>a[j])c++;
ans+=fac[8-i]*c;
}
return ans;
}
void work(int a[],int i){
if(i==0){
for(int j=1;j<=4;j++)swap(a[j],a[9-j]);
}else if(i==1){
int t=a[1];
a[1]=a[4],a[4]=a[3],a[3]=a[2],a[2]=t;
t=a[5];
a[5]=a[6],a[6]=a[7],a[7]=a[8],a[8]=t;
}else if(i==2){
int t=a[2];
a[2]=a[7];a[7]=a[6];a[6]=a[3];a[3]=t;
}
}
void bfs(){
queue<node> q;
node p;
for(int i=1;i<=8;i++)p.a[i]=i;
p.d=0;
q.push(p);
while(!q.empty()){
node p=q.front();
q.pop();
int ok=1;
for(int i=1;i<=8;i++)if(p.a[i]!=nd.a[i]){ok=0;break;}
if(ok){
printf("%d\n",p.d);
for(int i=1;i<=p.d;i++)
printf("%c",p.s[i]);
puts("");
break;
}
for(int i=0;i<3;i++){
node np=p;
work(np.a,i);
int num=cantor(np.a);
if(!vis[num]){
vis[num]=1;
np.d++;
np.s[np.d]='A'+i;
q.push(np);
}
}
}
}
int main(){
in(msquare);
fac[0]=1;
for(int i=1;i<=8;i++){
scanf("%d",&nd.a[i]);
fac[i]=fac[i-1]*i;
}
bfs();
return 0;
}
代码2
/*
USER:19flipp1
TASK:msquare
LANG:C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define in(s) freopen(#s".in","r",stdin);freopen(#s".out","w",stdout);
#define N 10
using namespace std;
int a[N],fac[N];
struct node{
int a[N];
int d;
char s[25];
}nd;
bool vis[8][8][8][8][8][8][8];
void work(int a[],int i){
if(i==0){
for(int j=1;j<=4;j++)swap(a[j],a[9-j]);
}else if(i==1){
int t=a[1];
a[1]=a[4],a[4]=a[3],a[3]=a[2],a[2]=t;
t=a[5];
a[5]=a[6],a[6]=a[7],a[7]=a[8],a[8]=t;
}else if(i==2){
int t=a[2];
a[2]=a[7];a[7]=a[6];a[6]=a[3];a[3]=t;
}
}
bool Vis(int a[]){
bool &t=vis[a[1]-1][a[2]-1][a[3]-1][a[4]-1][a[5]-1][a[6]-1][a[7]-1];
if(t)return 1;
t=1;
return 0;
}
void bfs(){
queue<node> q;
node p;
for(int i=1;i<=8;i++)p.a[i]=i;
p.d=0;
q.push(p);
while(!q.empty()){
node p=q.front();
q.pop();
int ok=1;
for(int i=1;i<=8;i++)if(p.a[i]!=nd.a[i]){ok=0;break;}
if(ok){
printf("%d\n",p.d);
for(int i=1;i<=p.d;i++)
printf("%c",p.s[i]);
puts("");
break;
}
for(int i=0;i<3;i++){
node np=p;
work(np.a,i);
if(!Vis(np.a)){
np.d++;
np.s[np.d]='A'+i;
q.push(np);
}
}
}
}
int main(){
in(msquare);
fac[0]=1;
for(int i=1;i<=8;i++){
scanf("%d",&nd.a[i]);
fac[i]=fac[i-1]*i;
}
bfs();
return 0;
}
【USACO 3.2】Magic Squares的更多相关文章
- 【USACO 1.2】Palindromic Squares
进制转换,然后判断是否是回文 /******************************************* TASK: palsquare LANG: C++ Created Time: ...
- 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费
[Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...
- 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛
[Usaco 2009 Gold]JZOJ2020年9月19日提高B组T3 头晕的奶牛 题目 Description 奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就会 ...
- 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题
[Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...
- 【Usaco 2009 Silver】JZOJ2020年9月19日提高B组T1 音乐节拍
[Usaco 2009 Silver]JZOJ2020年9月19日提高B组T1 音乐节拍 题目 Description FJ准备教他的奶牛弹奏一首歌曲,歌曲由N(1<=N<=50,000) ...
- 【USACO 2012 Open】Running Laps(树状数组)
53 奶牛赛跑 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈之后,比 ...
- 【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉
DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $ 当然这里的$i$和$k$都是偶数啦~ ...
- 【USACO 3.1】Stamps (完全背包)
题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...
- 【USACO 3.1】Contact(01子串按出现次数排序)
题意:给你一个01字符串,将长度为a到b之间(包含a.b)的子串按照出现次数排序.注意输入输出格式 题解:01子串对应一个二进制,为了区别11和011这样的不同子串,我们把长度也记录下来,官方题解是在 ...
随机推荐
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- JAVA Thread线程异常监控
一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...
- VMware安装CentOS时,无法以图形界面安装解决办法
有的同学问: 用虚拟机软件(vmware.VirtualBox)安装CentOS系统时, 安装过程中没有中文,也没有出现图形界面,都是以命令行方式去安装, 有时候又会出现图形界面,不知道哪里配置的问题 ...
- Java面试题整理一(侧重多线程并发)
1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...
- JavaScript学习笔记1之基础知识点
一.什么是JavaScrip JavaScript是一种动态类型.弱类型.基于原型的客户端脚本语言.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,在HTML网页 ...
- jquery实现ajax提交表单信息
最近在思考优化项目,想自己扩展一个jquery自动获取表单中的数据进行ajax提交.本人没有完整性学习jquery,基本上是现学现找,有点困难. 主要是扩展和拼接json转对象 很简单,附上代码: ; ...
- 弹出层layer的使用
弹出层layer的使用 Intro layer是一款web弹层组件,致力于服务各个水平段的开发人员.layer官网:http://layer.layui.com/ layer侧重于用户灵活的自定义,为 ...
- MYSQL基础操作之单表的增删改查
一.添加数据. -- 1.创建表,并插入一定的数据. CREATE TABLE STUDENT( ID INT, USERNAME ), SERVLET INT, JSP INT, ADDRESS ) ...
- 原创:jar的名字可能影响maven的依赖下载
自己定义了phoenix4.6-client的依赖关系POM,如下: <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- pscp工具上传或取回文件、文件夹
1.把服务器上的/root/dir目录取回本地"C:\My Documents\data\"目录 C:\>pscp.exe -r root@IP:/root/dir &quo ...