2048
题目大意:
模拟2048游戏
原题:
题目描述
此时,Conan却在一旁玩着2048。
这是一个4*4的矩阵,初始全为0。每次一个没有数字的格子中会随机出现一个2或4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
Conan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出“Game over!”(不包含引号)。
输入
输入第一行包含一个整数N,表示Conan滑了几下。
接下来N 行,x, y, v, f表示第x行与第y列出现数字为v后,Conan滑的方向为f(f为字符,U, D, L, R分别表示向上下左右滑)。
行从上往下1-4标号,列从左往右1-4标号。
数据保证在游戏未结束时,只会在空白区域出现数字。
输出
输出按题目描述。
输入样例
8
1 3 4 L
2 3 2 U
2 4 2 R
4 1 2 L
3 4 2 L
3 2 2 D
1 3 4 R
1 3 2 U
输出样例
0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0
说明
【数据规模与约定】
对于100%的数据满足。
解题思路:
直接模拟每一步,然后判断一下是否结束就行了
代码:
#include<cstdio>
using namespace std;
int n,x,y,c,a[10][10];
bool up()
{bool pd=true;for (int j=1;j<=4;++j){int i=0,k=1,gg=1;while(k<=4){while (!a[k][j]&&k<=4) k++;//寻找数字if (k>4) break;if (a[k][j]==a[i][j]&&!gg) a[i][j]*=2,gg=1;//合并else i++,a[i][j]=a[k][j],gg=0;//无法合并if (k!=i) a[k][j]=0;//清空else k++;}if (!a[4][j]) pd=false;//不是空的}if (pd) return true;return false;
}
bool down()
{bool pd=true;for (int j=1;j<=4;++j){int i=5,k=4,gg=1;while(k>0){while (!a[k][j]&&k>0) k--;if (!k) break;if (a[k][j]==a[i][j]&&!gg) a[i][j]*=2,gg=1;else i--,a[i][j]=a[k][j],gg=0;if (k!=i) a[k][j]=0;else k--;}if (!a[1][j]) pd=false;}if (pd) return true;return false;
}
bool left()
{bool pd=true;for (int i=1;i<=4;++i){int j=0,k=1,gg=1;while(k<=4){while (!a[i][k]&&k<=4) k++;if (k>4) break;if (a[i][k]==a[i][j]&&!gg) a[i][j]*=2,gg=1;else j++,a[i][j]=a[i][k],gg=0;if (k!=j) a[i][k]=0;else k++;}if (!a[i][4]) pd=false;}if (pd) return true;return false;
}
bool right()
{bool pd=true;for (int i=1;i<=4;++i){int j=5,k=4,gg=1;while(k>0){while (!a[i][k]&&k>0) k--;if (!k) break;if (a[i][k]==a[i][j]&&!gg) a[i][j]*=2,gg=1;else j--,a[i][j]=a[i][k],gg=0;if (k!=j) a[i][k]=0;else k--;}if (!a[i][1]) pd=false;}if (pd) return true;return false;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d %d %d",&x,&y,&c);a[x][y]=c;//放进去x=getchar();while (x!='U'&&x!='D'&&x!='L'&&x!='R')x=getchar();if (x=='U')//向上if (up()&&i!=n)//模拟并判断是否结束{printf("Game over!");return 0;}if (x=='D')//向下if (down()&&i!=n){printf("Game over!");return 0;}if (x=='L')//向左if (left()&&i!=n){printf("Game over!");return 0;}if (x=='R')//向右if (right()&&i!=n){printf("Game over!");return 0;}}for (int i=1;i<=4;++i){for (int j=1;j<=4;++j)printf("%d ",a[i][j]);printf("\n");}
}