jzoj 2050. 【8.18】2048

发布于 2019-03-31  935 次阅读


题目描述

此时,Conan却在一旁玩着2048。
这是一个4*4的矩阵,初始全为0。每次一个没有数字的格子中会随机出现一个2或4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
Conan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出“Game over!”(不包含引号)。

输入

从文件 game.in 中读入数据。
输入第一行包含一个整数N,表示Conan滑了几下。
接下来N 行,x, y, v, f表示第x行与第y列出现数字为v后,Conan滑的方向为f(f为字符,U, D, L, R分别表示向上下左右滑)。
行从上往下1-4标号,列从左往右1-4标号。
数据保证在游戏未结束时,只会在空白区域出现数字。

输出

输出到文件 game.out 中。
输出按题目描述。

思路

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
变态的模拟题(ノ=Д=)ノ┻━┻
手动强行模拟就可以了
只是细节很难而已

#include 
#include 
#include 
int a[5][5],b[5][5];
bool f[5],f1,f2;
using namespace std;
__attribute__((optimize("O2")))
int main()
{
    freopen("2048.in","r",stdin);
    freopen("2048.out","w",stdout);
    memset(a,0,sizeof(a));
    int n,m,x,y,v,i,j,k,l,o,xx,yr;
    char ch[2];
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        f1=false;
        scanf("%d%d%d%s",&x,&y,&v,&ch);
        if (a[x][y]==0) f1=true;
        a[x][y]=v;
        if (i==11)
        {
        yr++;           
        }
        if (ch[0]=='U')
        {

            for (j=1;j<=4;j++)
            {
                for (l=4;l>=1;l--)
                  {
                    if (a[l][j]==0)
                      for (o=l;o<=4;o++)
                      {
                        if (o+1<=4)
                        {
                        f1=true;
                        a[o][j]=a[o+1][j];
                        a[o+1][j]=0;
                        } 
                      }
                  }
                for (k=1;k<=4;k++)
                {
                  for (l=k;l>=1;l--)
                  {
                    if (a[l][j]==0)
                      for (o=l;o<=4;o++)
                      {
                        if (o+1<=4)
                        {
                            f1=true;
                        a[o][j]=a[o+1][j];
                        a[o+1][j]=0;
                        } 
                      }
                  }
                  for (xx=1;xx<=4;xx++)
                  if (a[xx][j]==a[xx+1][j]&&a[xx][j]!=0&&f[xx]==false&&f[xx+1]==false&&xx+1<=4)
                  {
                    f1=true;
                    f[xx]=true;
                    f[xx+1]=true;
                    a[xx][j]=a[xx][j]*2;
                    a[xx+1][j]=0;
                  }

                }
            for (xx=1;xx<=4;xx++)
                  f[xx]=false;
            }
        }
        else if (ch[0]=='D')
        {
            for (j=1;j<=4;j++)
            {
                for (l=1;l<=4;l++)
                  {
                    if (a[l][j]==0)
                      for (o=l;o>=1;o--)
                      {
                        f1=true;
                        a[o][j]=a[o-1][j];
                        a[o-1][j]=0;
                      }
                  }
                for (k=4;k>=1;k--)
                {
                 for (l=1;l<=k;l++)
                  {
                    if (a[l][j]==0)
                      for (o=l;o>=1;o--)
                      {
                        f1=true;
                        a[o][j]=a[o-1][j];
                        a[o-1][j]=0;
                      }
                  }
                for (xx=4;xx>=1;xx--)
                  if (a[xx][j]==a[xx-1][j]&&a[xx][j]!=0&&f[xx]==false&&f[xx-1]==false&&xx-1>=1)
                  {
                    f1=true;
                    f[xx]=true;
                    f[xx-1]=true;
                    a[xx][j]=a[xx][j]*2;
                    a[xx-1][j]=0;
                  }

                }
                for (xx=1;xx<=4;xx++)
                  f[xx]=false;
            }

        }
        else if (ch[0]=='L')
        {

            for (j=1;j<=4;j++)
            {
                 for (l=4;l>=1;l--)
                  {
                    if (a[j][l]==0)
                      for (o=l;o<=4;o++)
                      {
                        if (o+1<=4)
                        {
                  f1=true;      
                        a[j][o]=a[j][o+1];
                        a[j][o+1]=0;
                    }
                      }
                  }     
                for (k=1;k<=4;k++)
                {
                  for (l=k;l>=1;l--)
                  {
                    if (a[j][l]==0)
                      for (o=l;o<=4;o++)
                      {
                        if (o+1<=4)
                        {
                            f1=true;
                        a[j][o]=a[j][o+1];
                        a[j][o+1]=0;
                    }
                      }
                  }     
                  for (xx=1;xx<=4;xx++)
                  {         
                  if (a[j][xx]==a[j][xx+1]&&a[j][xx]!=0&&f[xx]==false&&f[xx+1]==false&&xx+1<=4)
                  {
                    f1=true;
                    f[xx]=true;
                    f[xx+1]=true;
                    a[j][xx]=a[j][xx]*2;
                    a[j][xx+1]=0;
                  }

                  }

                }
                for (xx=1;xx<=4;xx++)
                  f[xx]=false;
            }
        }
        else if (ch[0]=='R')
        {

            for (j=1;j<=4;j++)
            {
                 for (l=1;l<=4;l++)
                  {
                    if (a[j][l]==0)
                      for (o=l;o>=1;o--)
                      {
                        f1=true;
                        a[j][o]=a[j][o-1];
                        a[j][o-1]=0;
                      }
                  }         
                for (k=4;k>=1;k--)
                {
                  for (l=1;l<=k;l++)
                  {
                    if (a[j][l]==0)
                      for (o=l;o>=1;o--)
                      {
                        f1=true;        
                        a[j][o]=a[j][o-1];
                        a[j][o-1]=0;
                      }
                  }         
                for (xx=4;xx>=1;xx--)           
                  if (a[j][xx]==a[j][xx-1]&&a[j][xx]!=0&&f[xx]==false&&f[xx-1]==false&&xx-1>=1)
                  {
                    f1=true;
                    f[xx]=true;
                    f[xx-1]=true;
                    a[j][xx]=a[j][xx]*2;
                    a[j][xx-1]=0;
                  }

                }
                for (xx=1;xx<=4;xx++)
                  f[xx]=false;
            }
        }

    }
    if (!f1) printf("Game over!"); else
    for (i=1;i<=4;i++)
    {
        for (j=1;j<=4;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
}
]]>