时间:2021-07-01 10:21:17 帮助过:36人阅读
下午去打了个酱油,就做出一道最简单的题,2048游戏,实在是太菜了,马上要找工作了,复习的不到位啊! 解法: k记录要被放置的位置索引 1.k位置元素是0,将e[i]移到e[k] 2.k位置非零: (1)e[i]==e[k]相同,碰撞,e[k]×=2,k移到下一个位置(k或--k) (2
下午去打了个酱油,就做出一道最简单的题,2048游戏,实在是太菜了,马上要找工作了,复习的不到位啊!
解法:
k记录要被放置的位置索引
1.k位置元素是0,将e[i]移到e[k]
2.k位置非零:
(1)e[i]==e[k]相同,碰撞,e[k]×=2,k移到下一个位置(++k或--k)
(2)e[i]!=e[k]不同,k移到下一个位置(++k或--k),将e[i]移到e[k]
复杂度O(n^2),代码有点乱,没整理,如下:
#include#include inline void arrayMove(short (*val)[21],int n,std::string&dir){ if(dir=="up"){ for(int j=0;j =0;--i){ if(0==val[i][j]) continue; if(0==val[k][j]){ val[k][j]=val[i][j]; val[i][j]=0; }else if(val[i][j]==val[k][j]){ val[k][j]=val[i][j]<<1; val[i][j]=0; --k; }else{ --k; if(k!=i){ val[k][j]=val[i][j]; val[i][j]=0; } } } } }else if(dir=="left"){ for(int i=0;i<=n-1;++i){ int k=0; for(int j=1;j =0;--j){ if(0==val[i][j]) continue; if(0==val[i][k]){ val[i][k]=val[i][j]; val[i][j]=0; }else if(val[i][j]==val[i][k]){ val[i][k]=val[i][j]<<1; val[i][j]=0; --k; }else{ --k; if(k!=j){ val[i][k]=val[i][j]; val[i][j]=0; } } } } } } int main(int argc,char**argv){ int T=0; int N=0; int i=0; short (*val)[21]=new short[21][21]; std::string dir; std::cin>>T; while(++i<=T){ std::cin>>N; std::cin>>dir; for(int j=0;j >val[j][k]; arrayMove(val,N,dir); std::cout<<"Case #"<