HDU1667 : The Rotation Game
考虑枚举最后中间的数字,然后可以用一个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的更多相关文章
- 启发式搜索——A*算法
启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...
- UVALive 7139 Rotation(矩阵前缀和)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- The Rotation Game(IDA*算法)
The Rotation Game Time Limit : 30000/15000ms (Java/Other) Memory Limit : 300000/150000K (Java/Othe ...
- unity3d 的Quaternion.identity和transform.rotation区别是什么
Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可 ...
- ios layer 动画-(transform.rotation篇)
x轴旋转: CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"tra ...
- Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制
今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...
- [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 ...
- POJ2286 The Rotation Game
Description The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see ...
- 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 ...
随机推荐
- 菜鸟带你飞______DP基础26道水题
DP 158:11:22 1205:00:00 Overview Problem Status Rank (56) Discuss Current Time: 2015-11-26 19:11:2 ...
- Python爬虫经验
有时候读取同一个url,服务器可能会返回不同的response,并不是爬虫程序代码的问题,而是服务器的问题,初次试验request时,最好 把response文本保存在一个txt文件当中,以便后续的比 ...
- Android-自定义meta-data扩展数据
在接入第三方渠道SDK的时候,经常会看到其配置文件AndroidManifest.xml有类似如下的定义: [html] view plaincopy <!-- appid --> < ...
- 基础知识《二》java的基本类型
一.java基本数据类型 Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double.数值类型 ...
- Python发布Django项目的pyc版脚本
import os import sys from py_compile import compile #print "argvs:",sys.argv if len(sys.ar ...
- 58. 分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]
[本文链接] http://www.cnblogs.com/hellogiser/p/roman-to-integer-and-integer-to-roman.html [题目] 给出一个罗马数字, ...
- windows添加和删除服务
删除系统服务,记得一定要小心用.避免删错sc delete 服务名 加入服务: sc create 服务名 binPath= 路径 start= auto
- python将json格式的数据转换成文本格式的数据或sql文件
python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon ...
- 正则表达式里"-"中划线的使用注意
今天要匹配正则表达式,把非法的字符找出来,开始的写法是这个 [^A-Za-z0-9_.*-+%!],我的目的是把_.*-+%!这7个字符算合法字符,但是发现有许多其他字符也合法了,原来是中划线的位置不 ...
- hadoop中常见元素的解释
secondarynamenode 图: secondarynamenode根据文件的的大小对namenode的编辑日志和镜像日志 进行合并. 光从字面上来理解,很容易让一些初学者先入为主的认为:Se ...