考虑枚举最后中间的数字,然后可以用一个24位的整数来表示一个状态,一共有C(24,8)=735471种状态,然后BFS即可。

比赛的时候由于手速问题没写完TAT

写完后在坑爹评测机上还是TLE。

所以这是经过大量常数优化后的代码。

#include<cstdio>
struct P{int a,b,c,d;P(){}P(int _a,int _b,int _c,int _d){a=_a,b=_b,c=_c,d=_d;}}q[800000],x;
bool v[1<<24];
int i,j,k,S,a[24],ans,op[800000],mid,now[800000],h,t,Case;
void solve(int num){
for(i=S=0;i<24;i++)if(a[i]==num)S|=1<<i;
if(S==235968){
if(ans)ans=0,mid=num;
return;
}
v[S]=1,q[h=t=1]=P(S,0,0,0);
while(h<=t){
x=q[h],x.b++,x.d=h++;
if(x.b>ans)break;
int U=x.a;
S=(U&11499450)|(U>>2&1)|((U>>6&1)<<2)|((U>>11&1)<<6)|((U>>15&1)<<11)|((U>>20&1)<<15)|((U>>22&1)<<20)|((U&1)<<22);
if(!v[S]){
q[++t]=P(S,x.b,0,x.d),v[S]=1;
if(S==235968)break;
}
S=(U&6156021)|((U>>3&1)<<1)|((U>>8&1)<<3)|((U>>12&1)<<8)|((U>>17&1)<<12)|((U>>21&1)<<17)|((U>>23&1)<<21)|((U>>1&1)<<23);
if(!v[S]){
q[++t]=P(S,x.b,1,x.d),v[S]=1;
if(S==235968)break;
}
S=(U&16775183)|((U&1008)<<1)|((U>>10&1)<<4);
if(!v[S]){
q[++t]=P(S,x.b,2,x.d),v[S]=1;
if(S==235968)break;
}
S=(U&15736831)|((U&516096)<<1)|((U>>19&1)<<13);
if(!v[S]){
q[++t]=P(S,x.b,3,x.d),v[S]=1;
if(S==235968)break;
}
S=(U&6156021)|((U>>21&1)<<23)|((U>>17&1)<<21)|((U>>12&1)<<17)|((U>>8&1)<<12)|((U>>3&1)<<8)|((U>>1&1)<<3)|((U>>23&1)<<1);
if(!v[S]){
q[++t]=P(S,x.b,4,x.d),v[S]=1;
if(S==235968)break;
}
S=(U&11499450)|((U>>20&1)<<22)|((U>>15&1)<<20)|((U>>11&1)<<15)|((U>>6&1)<<11)|((U>>2&1)<<6)|((U&1)<<2)|(U>>22&1);
if(!v[S]){
q[++t]=P(S,x.b,5,x.d),v[S]=1;
if(S==235968)break;
}
S=(U&15736831)|((U&1032192)>>1)|((U>>13&1)<<19);
if(!v[S]){
q[++t]=P(S,x.b,6,x.d),v[S]=1;
if(S==235968)break;
}
S=(U&16775183)|((U&2016)>>1)|((U>>4&1)<<10);
if(!v[S]){
q[++t]=P(S,x.b,7,x.d),v[S]=1;
if(S==235968)break;
}
}
for(i=1;i<=t;i++){
if(q[i].a==235968){
if(q[i].b<ans){
ans=q[i].b;
for(j=ans,k=i;j;j--,k=q[k].d)op[j]=q[k].c;
mid=num;
}else if(q[i].b==ans){
for(j=ans,k=i;j;j--,k=q[k].d)now[j]=q[k].c;
int flag=0;
for(j=1;j<=ans;j++)if(op[j]!=now[j]){
if(op[j]>now[j])flag=1;
else flag=0;
break;
}
if(flag){
for(j=1;j<=ans;j++)op[j]=now[j];
mid=num;
}
}
}
v[q[i].a]=0;
}
}
int main(){
while(~scanf("%d",&a[0])){
if(!a[0])return 0;
for(i=1;i<24;i++)scanf("%d",&a[i]);
ans=~0U>>1;
solve(2),solve(1),solve(3);
if(!ans)puts("No moves needed");else{
for(i=1;i<=ans;i++)putchar(op[i]+'A');
puts("");
}
printf("%d\n",mid);
}
}

  

HDU1667 : The Rotation Game的更多相关文章

  1. 启发式搜索——A*算法

    启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...

  2. UVALive 7139 Rotation(矩阵前缀和)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  3. The Rotation Game(IDA*算法)

    The Rotation Game Time Limit : 30000/15000ms (Java/Other)   Memory Limit : 300000/150000K (Java/Othe ...

  4. unity3d 的Quaternion.identity和transform.rotation区别是什么

    Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可 ...

  5. ios layer 动画-(transform.rotation篇)

    x轴旋转: CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"tra ...

  6. Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制

    今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...

  7. [CareerCup] 1.8 String Rotation 字符串的旋转

    1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given t ...

  8. POJ2286 The Rotation Game

    Description The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see ...

  9. hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. 把 表拷贝到test测试数据库

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) bundle exec rake db:schema:load RAILS_ENV=test   注 ...

  2. Sqli-LABS通关笔录-1

    在第一个关卡当中还是学到些知识. 1.注释语句多试试其他的几个 2.不报错可能是前面的语句没有错误,union没有得到执行. http://127.0.0.1/sql/Less-1/index.php ...

  3. javascript对象转化为基本数据类型规则

    原文:Object-to-Primitive Conversions in JavaScript 对象转化为基础数据类型,其实最终都是用调用对象自带的valueOf和toString两个方法之一并获得 ...

  4. js:判断对象是否为空

    var list = []; var param = {}; ....... var hasProp = false; for (var prop in param){ hasProp = true; ...

  5. iOS 的UIWindow 类研究

    今日发现如果想做出漂亮的界面效果,就需要仔细研究一下UIWindow这个类.现在还不清楚为什么要有这么一个UIWindow类,它跟UIView的根本区别是什么?和Android中的什么类比较相像.先做 ...

  6. MYSQL 删除字段值为NULL的语法

    2014年9月1日 15:11:05 delete form your_table where your_field is null and your_field1 = '123' ...

  7. TokuDB的特点验证

    随着数据量越来越大,越来越频繁的遇到需要进行结构拆分的情况,每一次拆分都耗时很久,并且需要多方配合,非常的不想搞这个事情.于是在@zolker的提醒下想到了13年开源tokuDB,来解决我们迫在眉睫的 ...

  8. Enum:Backward Digit Sums(POJ 3187)

    反过来推 题目大意:就是农夫和这只牛又杠上了(怎么老是牛啊,能换点花样吗),给出一行数(从1到N),按杨辉三角的形式叠加到最后,可以得到一个数,现在反过来问你,如果我给你这个数,你找出一开始的序列(可 ...

  9. java call sap

    1.下载需要的jar,windows用dll,linux用so win下载地址     linux下载地址 win下载地址new 2.环境: windows -> sapjco3.dll放到wi ...

  10. Android之数据库操作

    安卓数据库帮助类 /** * 数据库帮助类,用于管理数据库 * @author Administrator * */ public class PersonSQLiteOpenHelper exten ...