标签:height pre cst 滚动 out 需要 put 效果 ==
Cube
题目
给你一个n×m的棋盘,有一个1×1×2的长方体竖直放在(1,1)上,你可以将其在棋盘上滚动,你的目标是让其竖直放在(n,m)上,问至少需要多少次操作。(放倒、竖直、翻滚)INPUT
一行,两个整数n,m (n<=m)OUTPUT
需要最少时间逃脱密室。若无解输出impossible。SAMPLE
INPUT1
1 1OUTPUT1
0INPUT2
2 4OUTPUT2
3INPUT3
4 7OUTPUT3
6
ans=4+((m-1)/3)×2+(m-1)%3
然而我们需要注意3×3的情况,答案为8,我就不证了(不会证),其实自己画个图,翻两下就可以了
ans=((n-1)/3+(m-1)/3+(n-1)%3+(m-1)%3)×2
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int n,m; 6 int ans(0); 7 int main(){ 8 scanf("%d%d",&n,&m); 9 if(n==1||n==2){ 10 if((m-1)%3){ 11 puts("impossible"); 12 return 0; 13 } 14 printf("%d",(((m-1)/3)<<1)+n-1); 15 return 0; 16 } 17 if(n==3){ 18 if(m==3){ 19 puts("8"); 20 return 0; 21 } 22 ans=2; 23 ans+=((m-1)/3)<<1; 24 if((m-1)%3) 25 ans+=2+(m-1)%3; 26 printf("%d",ans); 27 return 0; 28 } 29 ans+=((n-1)/3)<<1;//cout<<ans<<endl; 30 ans+=(n-1)%3;//cout<<ans<<endl; 31 ans+=((m-1)/3)<<1;//cout<<ans<<endl; 32 ans+=(m-1)%3;//cout<<ans<<endl; 33 printf("%d",ans); 34 }
标签:height pre cst 滚动 out 需要 put 效果 ==
原文地址:http://www.cnblogs.com/hzoi-mafia/p/7277706.html