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 ...
随机推荐
- [POJ1003]Hangover
[POJ1003]Hangover 试题描述 How far can you make a stack of cards overhang a table? If you have one card, ...
- Linux MySQL 存储引擎详解
MySQL常用的存储引擎为MyISAM.InnoDB.MEMORY.MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表. MyISAM是MySQL的默认存储引擎.MyISAM不支 ...
- RabbitMQ消息队列:ACK机制
每个Consumer可能需要一段时间才能处理完收到的数据.如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了. 因为我们采用no-ack的方式 ...
- 获取网页文档的URL和连接来源
<script type="text/javascript">document.write("链接来源:"+document.referrer+&q ...
- ios学习总结(2) -- UIButton的使用
原文地址 UIButton的类是一个UIControl子类,它实现了在触摸屏上的按钮.触摸一个按钮拦截事件和动作消息发送到目标对象时,它的挖掘.设定的目标和行动方法都继承自UIControl.这个类提 ...
- DOS 循环读取txt每一行内容
在命令行窗口中输入: for /f %i in (f:\mydata.txt) do echo %i 如果要是写成批处理文件run.bat for /f %%i in (f:\mydata.txt) ...
- mysql中的sql总结
>>>>>增加字段 ALTER TABLE pj_account ADD COLUMN test INT(11) NOT NULL DEFAULT 1 COMME ...
- C/C++函数参数读取顺序
#include <iostream> #include <stdio.h> using namespace std; void B(int a, int b){ cout & ...
- Cocos2dx实现象棋之布局
开始界面 #ifndef SCENESTART_H #define SCENESTART_H #include "cocos2d.h" #include "SceneGa ...
- 【Python】【解决】UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 1: ordinal not in range(128)
1.问题描述 今天在升级Ubuntu到14.04,使用命令行启动软件更新器,进行版本升级,结果开始升级就异常退出了,具体打印如下: $update-manager -d 正在检查新版 Ubuntu 使 ...