题目
1179.2048
时间限制:1000MS内存限制:65536KB
题目描述
此时,Conan却在一旁玩着2048。
这是一个4*4的矩阵,初始全为0。每次一个没有数字的格子中会随机出现一个2或4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
Conan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出“Game over!”(不包含引号)。
这是一个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标号。
数据保证在游戏未结束时,只会在空白区域出现数字。
接下来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
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
0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0
说明
【数据规模与约定】 对于100%的数据满足。
分析
一道纯模拟的题
很多细节要注意
在向右和向上开始循环的点要注意
每行每列两个数之间只能相加一次
代码
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int map[5][5],flag[5][5]; 5 int fun() 6 { 7 for (int i=1;i<=4;i++) 8 for (int j=1;j<=4;j++) 9 if (map[i][j]==0) 10 return 1; 11 return 0; 12 } 13 int main () 14 { 15 int n,a,b,c; 16 char f; 17 cin>>n; 18 for (int i=1;i<=n;i++) 19 { 20 cin>>a>>b>>c>>f; 21 if (fun()==0)z 22 { 23 cout<<"Game over!"; 24 return 0; 25 } 26 map[a][b]=c; 27 if (f=='L') 28 { 29 memset(flag,0,sizeof(flag)); 30 for (int i=1;i<=4;i++) 31 for (int j=1;j<=4;j++) 32 { 33 if (map[i][j]==0) 34 continue; 35 int wz=j; 36 for (int k=j-1;k>=1;k--) 37 { 38 if (map[i][k]==map[i][wz]&&flag[i][k]==0) 39 { 40 flag[i][k]=1; 41 map[i][k]=map[i][wz]*2; 42 map[i][wz]=0; 43 break; 44 } 45 if (map[i][k]==0) 46 { 47 int t=map[i][wz]; 48 map[i][wz]=0; 49 map[i][k]=t; 50 wz=k; 51 continue; 52 } 53 break; 54 } 55 } 56 } 57 if (f=='R') 58 { 59 memset(flag,0,sizeof(flag)); 60 for (int i=1;i<=4;i++) 61 for (int j=4;j>=1;j--) 62 { 63 if (map[i][j]==0) 64 continue; 65 int wz=j; 66 for (int k=j+1;k<=4;k++) 67 { 68 if (map[i][k]==map[i][wz]&&flag[i][k]==0) 69 { 70 flag[i][k]=1; 71 map[i][k]=map[i][wz]*2; 72 map[i][wz]=0; 73 break; 74 } 75 if (map[i][k]==0) 76 { 77 int t=map[i][wz]; 78 map[i][wz]=0; 79 map[i][k]=t; 80 wz=k; 81 continue; 82 } 83 break; 84 } 85 } 86 } 87 if (f=='U') 88 { 89 memset(flag,0,sizeof(flag)); 90 for (int i=1;i<=4;i++) 91 for (int j=1;j<=4;j++) 92 { 93 if (map[i][j]==0) 94 continue; 95 int wz=i; 96 for (int k=i-1;k>=1;k--) 97 { 98 if (map[wz][j]==map[k][j]&&flag[k][j]==0) 99 { 100 flag[k][j]=1; 101 map[k][j]=map[wz][j]*2; 102 map[wz][j]=0; 103 break; 104 } 105 if (map[k][j]==0) 106 { 107 int t=map[wz][j]; 108 map[wz][j]=0; 109 map[k][j]=t; 110 wz=k; 111 continue; 112 } 113 break; 114 } 115 } 116 } 117 if (f=='D') 118 { 119 memset(flag,0,sizeof(flag)); 120 for (int i=4;i>=1;i--) 121 for (int j=4;j>=1;j--) 122 { 123 if (map[i][j]==0) 124 continue; 125 int wz=i; 126 for (int k=i+1;k<=4;k++) 127 { 128 if (map[wz][j]==map[k][j]&&flag[k][j]==0) 129 { 130 flag[k][j]=1; 131 map[k][j]=map[wz][j]*2; 132 map[wz][j]=0; 133 break; 134 } 135 if (map[k][j]==0) 136 { 137 int t=map[wz][j]; 138 map[wz][j]=0; 139 map[k][j]=t; 140 wz=k; 141 continue; 142 } 143 break; 144 } 145 } 146 } 147 } 148 for (int i=1;i<=4;i++) 149 { 150 cout<<map[i][1]<<" "<<map[i][2]<<" "<<map[i][3]<<" "<<map[i][4]; 151 cout<<endl; 152 } 153 }