考虑枚举最后中间的数字,然后可以用一个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. Window_搭建SVN服务器

    http://wenku.baidu.com/link?url=614FLi_VlhiJpyG5bq8JcwFBHroMjsV3FvBDzyyn0snZ85jbWx7xh-RPJdH7stxlgM9i ...

  2. lucene搜索方式(query类型)

    Lucene有多种搜索方式,可以根据需要选择不同的方式. 1.词条搜索(单个关键字查找) 主要对象是TermQuery 调用方式如下: Term term=new Term(字段名,搜索关键字);Qu ...

  3. 部署细节回忆录(包括了nginx重启)

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) $cap -T $cap deploy:setup $cap deploy           (遇 ...

  4. c++ exports def文件

    https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx EXPORTS 引入了一个由一个或多个 definitions(导出的函 ...

  5. php增加对mysqli的支持

    php增加对mysqli的支持   我在fedora下使用yum安装的php和mysql,但是发现php不支持myslqi,只能编译一个mysqli的扩展给php用了. 方法如下: 1.下载php 2 ...

  6. PHP 的__call()

    PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法.如果你试着调用一个对象中不存在或被权限控制中的方法,__call 方法将会被自动调用. 例七:__call ...

  7. WCDMA是什么意思?CDMA是什么意思?GSM是什么意思

    有些朋友在购买3G智能手机的时候会遇到这样的困惑,为什么相同的手机会有不同手机网络制式之分呢?有的支持WCDMA/GSM,有的支持CDMA/GSM,到底自己应该选购哪一种手机好呢?WCDMA是什么意思 ...

  8. 《转》.NET开源核心运行时,且行且珍惜

    转载自infoQ 背景 InfoQ中文站此前报道过,2014年11月12日,ASP.NET之父.微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣 ...

  9. 《ASP.NET1200例》ListView 控件与DataPager控件的结合<二>

    ASP.NET使用ListView数据绑定控件和DataPager实现数据分页显示 为什么使用ListView+DataPager的方式实现分页显示? .net提供的诸多数据绑定控件,每一种都有它自己 ...

  10. vs2013秘钥

    Ultimate:BWG7X-J98B3-W34RT-33B3R-JVYW9 Premium:FBJVC-3CMTX-D8DVP-RTQCT-92494  YKCW6-BPFPF-BT8C9-7DCT ...