HDU1667 : The Rotation Game
2015-07-09 19:42
302 查看
考虑枚举最后中间的数字,然后可以用一个24位的整数来表示一个状态,一共有C(24,8)=735471种状态,然后BFS即可。
比赛的时候由于手速问题没写完TAT
写完后在坑爹评测机上还是TLE。
所以这是经过大量常数优化后的代码。
比赛的时候由于手速问题没写完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); } }
相关文章推荐
- STL算法设计理念 - 二元函数,二元谓词以及在set中的应用
- STL算法设计理念 - 二元函数,二元谓词以及在set中的应用
- Algorithms—58.Length of Last Word
- C++ HOJ 二阶魔方
- 你不知道的用例编写方法
- 长期接收碎片化的知识有什么弊端?
- C# 工具库
- JAVA注解
- 关于 App.config文件出错,配置系统未能初始化。 问题解决方案
- sql查询优化 索引优化
- Codeforces 534A Exam
- NYOJ 216 A problem is easy
- 打印数组中的汉字
- ZOJ 1047 Image Perimeters
- ehcache
- Python: The _imagingft C module is not installed错误的解决
- 从字符数组中删除特定字符
- ICONFONT的使用方法
- 搭建安卓开发环境
- 小胖学PHP总结4-----PHP的字符串操作