• 巨模拟2048


    真是巨模拟

    打模拟不要复制粘贴,模拟考验的是细节

    模拟容不得半点偷懒

    我的

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll mp[10][10],sta[10],sta2[10],vis[10],lst[10][10];
    ll n,m,x1,x2,yy1,y2,v1,v2,d,k,v,cnt=0,top,top2,ok=0,fen=0,already=0;
    void print(){
        for(ll i=1;i<=n;i++,puts(""))
            for(ll j=1;j<=n;j++)
                printf("%lld ",mp[i][j]);
    }
    int main(){
    //    freopen("game_sample2.in","r",stdin);
        scanf("%lld%lld",&n,&m);
        scanf("%lld%lld%lld%lld%lld%lld",&x1,&yy1,&v1,&x2,&y2,&v2);
        mp[x1][yy1]=v1;
        mp[x2][y2]=v2;
        for(ll q=1;q<=m;q++){
            ok=1;
            scanf("%lld%lld%lld",&d,&k,&v);
            for(ll i=1;i<=n;i++)
                for(ll j=1;j<=n;j++)
                    lst[i][j]=mp[i][j];
            if(already) continue ;
            if(d==0){//向上
                for(ll i=1;i<=n;i++){//
                    memset(vis,0,sizeof(vis));
                    memset(sta,0,sizeof(sta));
                    for(ll j=1;j<=n;j++){//
                        if(mp[j][i])
                            sta[++top]=mp[j][i];
                    }
                    for(ll j=1;j<=top;j++){
                        if(!vis[j]&&sta[j]==sta[j+1]){
                            sta2[++top2]=sta[j]*2;
                            fen+=sta[j]*2;
                            vis[j+1]=1;
                        }
                        else if(!vis[j]) sta2[++top2]=sta[j];
                    }
                    for(ll j=1;j<=n;j++)
                        mp[j][i]=0;
                    
                    for(ll j=1;j<=top2;j++)
                        mp[j][i]=sta2[j];
                    top2=0;top=0;
                }
            }
            else if(d==1){//向下
                for(ll i=1;i<=n;i++){//
                    memset(vis,0,sizeof(vis));
                    memset(sta,0,sizeof(sta));
                    for(ll j=n;j>=1;j--){//
                        if(mp[j][i])
                            sta[++top]=mp[j][i];
                    }
                    for(ll j=1;j<=top;j++){
                        if(!vis[j]&&sta[j]==sta[j+1]){
                            sta2[++top2]=sta[j]*2;
                            fen+=sta[j]*2;
                            vis[j+1]=1;
                        }
                        else if(!vis[j]) sta2[++top2]=sta[j];
                    }
                    for(ll j=1;j<=n;j++)
                        mp[j][i]=0;
                    
                    for(ll j=1;j<=top2;j++)
                        mp[n-j+1][i]=sta2[j];
    //                print();
    //                printf("**i=%lld top2=%lld top=%lld
    ",i,top2,top);
                    top=0;top2=0;
                }
            }
            else if(d==2){//向左
                for(ll i=1;i<=n;i++){//
                    memset(vis,0,sizeof(vis));
                    memset(sta,0,sizeof(sta));
                    for(ll j=1;j<=n;j++){//
                        if(mp[i][j])
                            sta[++top]=mp[i][j];
                    }
                    for(ll j=1;j<=top;j++){
                        if(!vis[j]&&sta[j]==sta[j+1]){
                            sta2[++top2]=sta[j]*2;
                            fen+=sta[j]*2;
                            vis[j+1]=1;
                        }
                        else if(!vis[j]) sta2[++top2]=sta[j];
                    }
                    for(ll j=1;j<=n;j++)
                        mp[i][j]=0;
                    
                    for(ll j=1;j<=top2;j++)
                        mp[i][j]=sta2[j];
    //                print();
    //                printf("**i=%lld top2=%lld top=%lld
    ",i,top2,top);
                    top=0;top2=0;
                }
            }
            else if(d==3){//向右
                for(ll i=1;i<=n;i++){//
                    memset(vis,0,sizeof(vis));
                    memset(sta,0,sizeof(sta));
                    for(ll j=n;j>=1;j--){
                        if(mp[i][j])
                            sta[++top]=mp[i][j];
                    }
                    for(ll j=1;j<=top;j++){
                        if(!vis[j]&&sta[j]==sta[j+1]){
                            sta2[++top2]=sta[j]*2;
                            fen+=sta[j]*2;
                            vis[j+1]=1;
                        }
                        else if(!vis[j]) sta2[++top2]=sta[j];
                    }
                    for(ll j=1;j<=n;j++)
                        mp[i][j]=0;
                    for(ll j=1;j<=top2;j++)
                        mp[i][n-j+1]=sta2[j];
                    top2=0;top=0;
                }
            }        
    //        printf("q=%lld
    ",q);
    //        print();
            for(ll i=1;i<=n;i++)
                for(ll j=1;j<=n;j++){
                    if(mp[i][j]!=lst[i][j]){
                        ok=0;
                    }
                }
    //        print();
            ll cnt=0;
            for(ll i=1;i<=n;i++){
                for(ll j=1;j<=n;j++){
                    if(!mp[i][j]){
                        cnt++;
                    }
                }
            }if(cnt){
                k%=cnt;
                k++;
            }
            else k=1;
            cnt=0;
            for(ll i=1;i<=n;i++){
                for(ll j=1;j<=n;j++){
                    if(!mp[i][j]){
                        cnt++;
                        if(cnt==k) {
                            mp[i][j]=v;
                            goto E;
                        }
                    }
                }
            }
            E:;
    //        print();
            if(ok==1){
                already=q;
            }
        }
        if(already==0){
            printf("%lld
    %lld
    ",m,fen);
        }
        else
        printf("%lld
    %lld
    ",already-1,fen);
    }
    View Code

    lsc的2048[专业版]

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define re register
    inline int read()
    {
        int x=0,f=1;char cc=getchar();
        while(cc>'9'||cc<'0'){if(cc=='-')f=-1;cc=getchar();}
        while(cc>='0'&&cc<='9'){x=(x<<1)+(x<<3)+cc-'0';cc=getchar();}
        return x*f;
    }
    int n,m;
    int mp[520][520];
    int las[520][520];
    bool vis[520][520];
    int ans=0;
    bool jud=0;
    inline bool judge()
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(mp[i][j]!=las[i][j])return 0;
            }
        }
        return 1;
    }
    inline void debug()//记得删!
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                printf("%lld ",mp[i][j]);
            }
            puts("");
        }
        puts("");
        return ;
    }
    inline void get(int dir)
    {
        //0/1/2/3分别代表上下左右!
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                las[i][j]=mp[i][j];
            }
        }
        if(dir==0)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {   
                    if(!mp[i][j])continue;
                    int cp=i-1;
                    while(!mp[cp-1][j]&&cp-1>=1)cp--;
                    if(mp[cp][j])cp++;
                    cp=max(cp,1ll);
                    //printf("up %d %d %d %d
    ",i,j,cp,j);
                    if(mp[cp-1][j]&&mp[cp-1][j]==mp[i][j]&&!vis[cp-1][j])
                    {   
                        mp[cp-1][j]*=2;ans+=mp[cp-1][j];vis[cp-1][j]=1;
                        mp[cp][j]=mp[i][j]=0;
                    }
                    else
                    {
                        int pc=mp[i][j];mp[i][j]=0;mp[cp][j]=pc;
                    }
                    
                }
            }
        }
        else if(dir==1)
        {
            for(int i=n;i>=1;i--)
            {
                for(int j=1;j<=n;j++)
                {
                    if(!mp[i][j])continue;
                    int cp=i+1;
                    while(!mp[cp+1][j]&&cp+1<=n)cp++;
                    if(mp[cp][j])cp--;
                    cp=min(cp,n);
                    //printf("down %d %d %d %d
    ",i,j,cp,j);
                    if(mp[cp+1][j]&&mp[cp+1][j]==mp[i][j]&&!vis[cp+1][j])
                    {
                        //printf("*2maker_it!
    ");
                        mp[cp+1][j]*=2;ans+=mp[cp+1][j];vis[cp+1][j]=1;
                        mp[i][j]=mp[cp][j]=0;
                    }
                    else
                    {
                        //printf("putong maker_it
    ");
                        int pc=mp[i][j];mp[i][j]=0;mp[cp][j]=pc;
                    }
                }
            }
        }
        else if(dir==2)
        {
            for(int j=1;j<=n;j++)
            {
                for(int i=1;i<=n;i++)
                {
                    if(!mp[i][j])continue;
                    int cp=j-1;
                    while(!mp[i][cp-1]&&cp-1>=1)cp--;
                    if(mp[i][cp])cp++;
                    cp=max(cp,1ll);
                    //printf("left %d %d %d %d 
    ",i,j,i,cp);
                    if(mp[i][cp-1]&&mp[i][cp-1]==mp[i][j]&&!vis[i][cp-1])
                    {
                        //printf("type1 out!
    ");
                        mp[i][cp-1]*=2;ans+=mp[i][cp-1];vis[i][cp-1]=1;
                        mp[i][j]=mp[i][cp]=0;
                    }
                    else
                    {
                        //printf("type2 out!
    ");
                        int pc=mp[i][j];
                        mp[i][j]=0;mp[i][cp]=pc;
                    }
                }
            }
        }
        else if(dir==3)
        {
            for(int j=n;j>=1;j--)
            {
                for(int i=1;i<=n;i++)
                {
                    if(!mp[i][j])continue;
                    int cp=j+1;
                    while(!mp[i][cp+1]&&cp+1<=n)cp++;
                    if(mp[i][cp])cp--;
                    cp=min(cp,n);
                    //printf("right %d %d %d %d 
    ",i,j,i,cp);
                    if(mp[i][cp+1]&&mp[i][cp+1]==mp[i][j]&&!vis[i][cp+1])
                    {
                        mp[i][cp+1]*=2;ans+=mp[i][cp+1];vis[i][cp+1]=1;
                        mp[i][j]=mp[i][cp]=0;
                    }
                    else
                    {
                        int pc=mp[i][j];mp[i][j]=0;mp[i][cp]=pc;
                    }
                }
            }
        }
        //debug();//
        return ;
    }
    inline void make(int pos,int vall)
    {
        int ress=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(!mp[i][j])ress++;
            }
        }
        int poss=1+pos%ress;
        //printf("%d %d
    ",ress,poss);
        ress=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(!mp[i][j])ress++;
                if(ress==poss)
                {
                    mp[i][j]=vall;
                    //printf("make :  %d %d 
    ",i,j);
                    return ;
                }
            }
        }
        return ;
    }
    signed main()
    {
        //freopen("game_sample2.in","r",stdin);
        //freopen("cnm1.in","r",stdin);
        //freopen("me1.out","w",stdout);
        int cpp=0;
        n=read(),m=read();
        int xx,yy,vv;
        xx=rand()%n+1,yy=rand()%n+1,vv=2;mp[xx][yy]=vv;
        xx=rand()%n+1,yy=rand()%n+1,vv=2;mp[xx][yy]=vv;
        //debug();//
        //0/1/2/3分别代表上下左右!
        int dir,pos,val;
        char s;
        while(1)
        {
            cin>>s;
            if(s=='w')dir=0;
            if(s=='s')dir=1;
            if(s=='a')dir=2;
            if(s=='d')dir=3;
            pos=rand()%100,val=2;
            //printf("%d
    ",dir);
            get(dir);
            //printf("judement %d
    ",judge());
            if(judge()){puts("YOU HAVE DIED!");break;}
            cpp++;
            make(pos,val);
            debug();
            printf("%lld
    ",ans);
        }
        printf("%d
    %d
    ",cpp,ans);
        return 0;
    }
    View Code
  • 相关阅读:
    python threading模块中对于信号的抓取
    docker挂载NVIDIA显卡运行pytorch
    更换HomeBrew源
    IX-Protected Dataplane Operating System解读
    NFV、DPDK以及部分用户态协议研究
    (一)最小的Django
    (二)无状态的web应用(单py的Django占位图片服务器)
    Windows7 64位环境下Python-igraph环境配置
    关于docker使用的几个小问题(二)
    关于docker使用的几个小问题(一)
  • 原文地址:https://www.cnblogs.com/znsbc-13/p/11673198.html
Copyright © 2020-2023  润新知