【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这样的不同子串,我们把长度也记录下来,官方题解是在 ...
随机推荐
- 理解ThreadLocal —— 一个map的key
作用: 当工作于多线程中的对象使用ThreadLocal维护变量时,threadLocal为每个使用该变量的线程分配一个独立的变量副本. 接口方法: protected T initialValue( ...
- python学习笔记(基础一:'hello world'、变量、字符编码)
第一个python程序: Hello World程序 windows命令行中输入:python,进入python交互器,也可以称为解释器. print("Hello World!" ...
- 使用PhantomJS实现网页截图服务
这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片.研究了不少工具,效果都不理想,不是显示太差了(Canvas.Html2Image.Cobra),就是性能不怎么样(如SWT的Brower). ...
- 脚本化CSS类-HTML5 classList属性
HTML元素可以有多个CSS类名,class属性保存了一个用空格隔开的类名列表.标识符class在JavaScript中是保留字,所以在JavaScript中可以用className. //如下代码设 ...
- SQL Server导入数据时“启用标示插入”详解
在SQL Server中导入数据时,会有一个"启用标示插入"的选项,突然间懵逼了,这到底啥意思?我选与不选这个选项,结果好像没区别!不科学啊这,"存在即合理", ...
- RESTful Api 身份认证安全性设计
REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 H ...
- HTML中的标记-遁地龙卷风
第三版 上一版本在未经验证的情况下,盲目的认为很多东西是那样,造成错误,非常抱歉. 0.什么是标记 <input type="checkbox" checked />& ...
- Centos6.2设置静态ip和dns
参考了如下文章:https://gist.github.com/fernandoaleman/2172388http://www.lifelinux.com/how-to-configure-stat ...
- javascript 设置input框只读属性 获取disabled后的值并传给后台
input只读属性 有两种方式可以实现input的只读效果:disabled 和 readonly. 自然两种出来的效果都是只能读取不能编辑,可是两者有很大不同. Disabled说明该input ...
- HTML中使图片居中显示
注:imageId为图片id<style type="text/css"> #imageId{ display:block; position:relative; ma ...