#include <iostream> #include <cstdio> #include <vector> #include <queue> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <memory> #include <limits> using namespace std; #define INF 0x7fffffff #define MAXN 5 int mat[MAXN][MAXN]; void leftblank(int row, int col) { int start = col; while(mat[row][start] != 0) //find zero start++; for (int i = start + 1; i < 4; ++i) //remove if (mat[row][i] != 0) swap(mat[row][start++], mat[row][i]); } void left() { for (int i = 0; i < 4; ++i) { leftblank(i, 0); for (int j = 0; j < 3; ++j) { if (mat[i][j] == 0) break; else if (mat[i][j] == mat[i][j + 1]) { mat[i][j] += mat[i][j + 1]; mat[i][j + 1] = 0; leftblank(i, j + 1); } } } } void rightblank(int row, int col) { int start = col; while (mat[row][start] != 0) //find zero start--; for (int i = start - 1; i >= 0; --i) //remove if (mat[row][i] != 0) swap(mat[row][start--], mat[row][i]); } void right() { for (int i = 0; i < 4; ++i) { rightblank(i, 3); for (int j = 3; j > 0; --j) { if (mat[i][j] == 0) break; else if (mat[i][j] == mat[i][j - 1]) { mat[i][j] += mat[i][j-1]; mat[i][j-1] = 0; rightblank(i, j-1); } } } } void upblank(int row, int col) { int start = row; while (mat[start][col] != 0) //find zero start++; for (int i = start + 1; i < 4; ++i) //remove if (mat[i][col] != 0) swap(mat[start++][col], mat[i][col]); } void up() { for (int j = 0; j < 4; ++j) { upblank(0, j); for (int i = 0; i < 3; ++i) { if (mat[i][j] == 0) break; else if (mat[i][j] == mat[i+1][j]) { mat[i][j] += mat[i+1][j]; mat[i+1][j] = 0; upblank(i + 1, j); } } } } void downblank(int row, int col) { int start = row; while (mat[start][col] != 0) //find zero start--; for (int i = start - 1; i >= 0; --i) //remove if (mat[i][col] != 0) swap(mat[start--][col], mat[i][col]); } void down() { for (int j = 0; j < 4; ++j) { downblank(3, j); for (int i = 3; i > 0; --i) { if (mat[i][j] == 0) break; else if (mat[i][j] == mat[i - 1][j]) { mat[i][j] += mat[i - 1][j]; mat[i - 1][j] = 0; downblank(i - 1, j); } } } } int _tmain(int argc, TCHAR *argv[]) { for (int i = 0; i < 4; ++i) for (int j = 0; j < 4; ++j) cin >> mat[i][j]; int d; cin >> d; switch (d) { case 0: left(); break; case 1: up(); break; case 2: down(); break; case 3: right(); break; default: break; } for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) printf("%d", mat[i][j]); printf("\n"); } getchar(); return 0; }