题目描述
此时,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");
}
}
Comments NOTHING