小C最近迷上了 2048 的游戏,但是他想更新一下游戏,于是用 C++ 重新编写,具体的游戏规则为: 一张 4\*4 的棋盘,每个方格初始为空。每个操作是在某一个方格内产生一个数字2或者4,之后产生一个动作方向,表示棋盘中所有的数字都向该方向聚拢,使得数字全部聚拢到棋盘的一边,在这个过程中,如果相邻两个数字相同,则会叠加。如果在本次操作之前,棋盘每个方格已经被填满数字了,则直接输出四行四列棋盘中的数字,否则输出所有操作完成后,棋盘的状态,没有数字的用 0 填充。
数据保证在游戏未结束时,只会在空白区域出现数字
输入第一行包含一个整数 N,表示操作数 接下来 N 行,x, y, v, f 表示第 x 行与第 y 列出现数字为 v 后,小C 滑的方 向为 f(f 为字符,U, D, L, R 分别表示向上下左右滑)。
目前问题:
输入:
75
2 3 2 U
2 3 2 D
1 4 2 U
1 1 2 D
3 4 2 L
2 1 2 D
2 4 2 D
3 2 2 R
1 3 2 D
3 1 2 L
2 4 2 R
1 4 2 D
1 4 2 R
1 3 2 U
3 1 2 D
1 3 2 L
4 4 2 U
2 3 2 U
3 2 2 R
4 4 2 D
3 1 2 U
3 3 2 L
3 4 2 R
4 4 2 U
4 2 2 R
3 2 2 U
3 2 2 R
3 1 2 L
2 4 2 U
2 3 2 D
1 3 2 D
2 4 2 L
1 4 2 R
1 3 2 R
2 1 2 L
3 4 2 L
2 3 2 R
4 1 2 L
1 4 2 U
4 4 2 U
4 2 2 U
4 4 2 L
4 4 2 U
4 4 2 U
3 2 2 L
3 4 2 U
3 3 2 U
3 4 2 U
4 4 2 D
1 3 2 D
1 2 2 D
2 4 2 R
2 1 2 R
1 1 2 L
1 4 2 L
1 4 2 R
4 2 2 D
1 1 2 R
2 1 2 U
4 4 2 R
1 1 2 L
2 3 2 U
4 4 2 U
4 4 2 D
1 1 2 L
2 4 2 R
2 1 2 U
4 1 2 D
1 3 2 U
4 1 2 U
4 2 2 L
4 4 2 U
4 1 2 U
4 4 2 U
4 4 2 U
样例输出:
8 2 4 4
2 64 16 2
4 16 4 0
2 0 0 0
我:
8 4 16 4
2 32 2 2
16 8 0 0
2 16 0 0
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int a[6][6];
bool f(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(a[i][j]==0) return 1;
return 0;
}
int main(){
int t;
cin>>t;
while(t--){
if(f()==0){
for(int i=1;i<=4;i++,cout<<endl)
for(int j=1;j<=4;j++)
cout<<a[i][j]<<' ';
return 0;
}
int x,y,v;
char f;
cin>>x>>y>>v>>f;
a[x][y]=v;
if(f=='U')
for(int j=1;j<=4;j++){
if(a[1][j]+a[2][j]+a[3][j]+a[4][j]!=0)//这一列有数
while(a[1][j]==0)
a[1][j]=a[2][j],a[2][j]=a[3][j],a[3][j]=a[4][j],a[4][j]=0;
if(a[2][j]+a[3][j]+a[4][j]!=0)
while(a[2][j]==0) a[2][j]=a[3][j],a[3][j]=a[4][j],a[4][j]=0;
if(a[3][j]+a[4][j]!=0&&a[3][j]==0) a[3][j]=a[4][j],a[4][j]=0;
if(a[1][j]==a[2][j]&&a[2][j]==a[3][j]&&a[3][j]==a[4][j]){//2 2 2 2
a[1][j]*=4,a[2][j]=a[3][j]=a[4][j]=0;
continue;
}
else if(a[1][j]==a[2][j]&&a[3][j]==a[4][j]){//2 2 4 4
a[1][j]*=2,a[2][j]=a[3][j]*2,a[3][j]=a[4][j]=0;
continue;
}
else if(a[1][j]==a[2][j])//2 2 8 4
a[1][j]*=2,a[2][j]=a[3][j],a[3][j]=a[4][j],a[4][j]=0;
else if(a[2][j]==a[3][j])//2 4 4 2
a[2][j]*=2,a[3][j]=a[4][j],a[4][j]=0;
else if(a[3][j]==a[4][j])//2 2 4 4
a[3][j]*=2,a[4][j]=0;
else continue;
//接下来只剩3个了
if(a[1][j]==a[2][j])
a[1][j]*=2,a[2][j]=a[3][j],a[3][j]=0;
else if(a[2][j]==a[3][j])
a[2][j]*=2,a[3][j]=0;
else continue;
//接下来剩2个
if(a[1][j]==a[2][j])
a[1][j]*=2,a[2][j]=0;
}
if(f=='D')
for(int j=1;j<=4;j++){
if(a[4][j]+a[3][j]+a[2][j]+a[1][j]!=0)
while(a[4][j]==0)
a[4][j]=a[3][j],a[3][j]=a[2][j],a[2][j]=a[1][j],a[1][j]=0;
if(a[3][j]+a[2][j]+a[1][j]!=0)
while(a[3][j]==0) a[3][j]=a[2][j],a[2][j]=a[1][j],a[1][j]=0;
if(a[2][j]+a[1][j]!=0&&a[2][j]==0) a[2][j]=a[1][j],a[1][j]=0;
if(a[4][j]==a[3][j]&&a[3][j]==a[2][j]&&a[2][j]==a[1][j]){
a[4][j]*=4,a[3][j]=a[2][j]=a[1][j]=0;
continue;
}
else if(a[4][j]==a[3][j]&&a[2][j]==a[1][j]){
a[4][j]*=2,a[3][j]=a[2][j]*2,a[2][j]=a[1][j]=0;
continue;
}
else if(a[4][j]==a[3][j])
a[4][j]*=2,a[3][j]=a[2][j],a[2][j]=a[1][j],a[1][j]=0;
else if(a[3][j]==a[2][j])
a[3][j]*=2,a[2][j]=a[1][j],a[1][j]=0;
else if(a[2][j]==a[1][j])
a[2][j]*=2,a[1][j]=0;
else continue;
if(a[4][j]==a[3][j])
a[4][j]*=2,a[3][j]=a[2][j],a[2][j]=0;
else if(a[3][j]==a[2][j])
a[3][j]*=2,a[2][j]=0;
else continue;
if(a[4][j]==a[3][j])
a[4][j]*=2,a[3][j]=0;
}
if(f=='L')
for(int i=1;i<=4;i++){
if(a[i][1]+a[i][2]+a[i][3]+a[i][4]!=0)
while(a[i][1]==0)
a[i][1]=a[i][2],a[i][2]=a[i][3],a[i][3]=a[i][4],a[i][4]=0;
if(a[i][2]+a[i][3]+a[i][4]!=0)
while(a[i][2]==0) a[i][2]=a[i][3],a[i][3]=a[i][4],a[i][4]=0;
if(a[i][3]+a[i][4]!=0&&a[i][3]==0) a[i][3]=a[i][4],a[i][4]=0;
if(a[i][1]==a[i][2]&&a[i][2]==a[i][3]&&a[i][3]==a[i][4]){
a[i][1]*=4,a[i][2]=a[i][3]=a[i][4]=0;
continue;
}
else if(a[i][1]==a[i][2]&&a[i][3]==a[i][4]){
a[i][1]*=2,a[i][2]=a[i][3]*2,a[i][3]=a[i][4]=0;
continue;
}
else if(a[i][1]==a[i][2])
a[i][1]*=2,a[i][2]=a[i][3],a[i][3]=a[i][4],a[i][4]=0;
else if(a[i][2]==a[i][3])
a[i][2]*=2,a[i][3]=a[i][4],a[i][4]=0;
else if(a[i][3]==a[i][4])
a[i][3]*=2,a[i][4]=0;
else continue;
if(a[i][1]==a[i][2])
a[i][1]*=2,a[i][2]=a[i][3],a[i][3]=0;
else if(a[i][2]==a[i][3])
a[i][2]*=2,a[i][3]=0;
else continue;
if(a[i][1]==a[i][2])
a[i][1]*=2,a[i][2]=0;
}
if(f=='R')
for(int i=1;i<=4;i++){
if(a[i][4]+a[i][3]+a[i][2]+a[i][1]!=0)
while(a[i][4]==0)
a[i][4]=a[i][3],a[i][3]=a[i][2],a[i][2]=a[i][1],a[i][1]=0;
if(a[i][3]+a[i][2]+a[i][1]!=0)
while(a[i][3]==0) a[i][3]=a[i][2],a[i][2]=a[i][1],a[i][1]=0;
if(a[i][2]+a[i][1]!=0&&a[i][2]==0) a[i][2]=a[i][1],a[i][1]=0;
if(a[i][4]==a[i][3]&&a[i][3]==a[i][2]&&a[i][2]==a[i][1]){
a[i][4]*=4,a[i][3]=a[i][2]=a[i][1]=0;
continue;
}
else if(a[i][4]==a[i][3]&&a[i][2]==a[i][1]){
a[i][4]*=2,a[i][3]=a[i][2]*2,a[i][2]=a[i][1]=0;
continue;
}
else if(a[i][4]==a[i][3])
a[i][4]*=2,a[i][3]=a[i][2],a[i][2]=a[i][1],a[i][1]=0;
else if(a[i][3]==a[i][2])
a[i][3]*=2,a[i][2]=a[i][1],a[i][1]=0;
else if(a[i][2]==a[i][1])
a[i][2]*=2,a[i][1]=0;
else continue;
if(a[i][4]==a[i][3])
a[i][4]*=2,a[i][3]=a[i][2],a[i][2]=0;
else if(a[i][3]==a[i][2])
a[i][3]*=2,a[i][2]=0;
else continue;
if(a[i][4]==a[i][3])
a[i][4]*=2,a[i][3]=0;
}
for(int i=1;i<=4;i++,cout<<endl)
for(int j=1;j<=4;j++)
cout<<a[i][j]<<' ';
}
for(int i=1;i<=4;i++,cout<<endl)
for(int j=1;j<=4;j++)
cout<<a[i][j]<<' ';
return 0;
}