【模拟】2048
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");} }總結
- 上一篇: iso文件怎么打开 大家一起来学习一下吧
- 下一篇: cloudy是什么意思 cloudy的中