【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这样的不同子串,我们把长度也记录下来,官方题解是在 ...
随机推荐
- shiro的使用1 简单的认证
最近在重构,有空学了一个简单的安全框架shiro,资料比较少,在百度和google上能搜到的中文我看过了,剩下的时间有空会研究下官网的文章和查看下源码, 简单的分享一些学习过程: 1,简单的一些概念上 ...
- spring mvc 和spring security配置 web.xml设置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...
- 高效 Java Web 开发框架 JessMA v3.4.1
JessMA 是功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate.MyBatis 与 J ...
- spring的依赖注入,为什么用接口的实现类而不是父类的继承类?
@Resource private EmployeeService employeeService; public void setEmployeeService(EmployeeService em ...
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- SSH框架整合
SSH框架整合 一.原理图 action:(struts2) 1.获取表单的数据 2.表单的验证,例如非空验证,email验证等 3.调用service,并把数据传递给service Service: ...
- 如果把带有html的标记的字符串从服务端传到页面上,需要对其进行编码。Ajax.JavaScriptStringEncode()
controller: StringBuilder s = new StringBuilder(); string a = "<script>alert('我StringBuil ...
- [译]为什么我要离开gulp和grunt转投npm脚本的怀抱
原文链接:https://medium.freecodecamp.com/why-i-left-gulp-and-grunt-for-npm-scripts-3d6853dd22b8#.n7m1855 ...
- ArcGIS Engine开发之量测功能
1.距离测量 距离测量时,片段长度通过两点之间距离计算得到,全部长度通过片段长度的和计算得到.主要用到INewLineFeedback和IScreenDisplay两个接口. 1)INewLineFe ...
- iOS中的一些细节
1. 在使用单例模式时一般使用allocWithZone 因为alloc最终还是会调用allocWithZone进行分配空间 2. synchronized 线程锁(互斥锁) 优点:能防止多线程抢夺资 ...