考虑枚举最后中间的数字,然后可以用一个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. js 中数组或者对象的深拷贝和浅拷贝

    浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...

  2. puppet 安装

    yum源配置 1. wget http://ftp.kaist.ac.kr/fedora//epel/6/i386/epel-release-6-8.noarch.rpm 2. yum list | ...

  3. Linux LAMP环境搭建

    什么是LAMP Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了 ...

  4. 【SpringMVC】SpringMVC系列5之@RequestHeader 映射请求头属性值

    5.@RequestHeader 映射请求头属性值 5.1.概述 请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中 ...

  5. 查看别人的css

    ie工具栏的“文件”选项选“另存为”到你本地电脑,存下来有两个文件 一个是空间名称命名的文件夹和html网页,文件加里有三个扩展名为.css的文件

  6. 正则表达式里"-"中划线的使用注意

    今天要匹配正则表达式,把非法的字符找出来,开始的写法是这个 [^A-Za-z0-9_.*-+%!],我的目的是把_.*-+%!这7个字符算合法字符,但是发现有许多其他字符也合法了,原来是中划线的位置不 ...

  7. 使用php递归计算目录大小

    统计一个目录大小,因为不知道目录中子目录的深度,所以for循环很难实现,但是用递归调用很容易实现,只要统计出一个目录中所有文件的大小,那么每一次调用就可以了,随便建了个目录,建立一些文件,方法代码如下 ...

  8. ORACLE查询当前资产状态,和另一个数据库联查,(查询重复数据中第一条),子查询作为字段查询

    背景:ORACLE查询当前资产状态,包含资产信息(表1),资产维修状态(表2),资产报废状态(表3) 如下: 资产信息:

  9. Android-- FragmentStatePagerAdapter分页(转载)

    转载地址:http://blog.csdn.net/dreamzml/article/details/9951577 ViewPager ViewPager 如其名所述,是负责翻页的一个 View.准 ...

  10. 【读书笔记】读《JavaScript设计模式》之观察者模式

    一.定义 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者(publisher-subscripber)模式)是一种管理人与其任务之间的关系(确切地讲,是对象 ...