SWexpertAcademy

6109. 추억의 2048게임

먼지의삶 2019. 8. 10. 00:13
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;

int n;
int map[21][21];
int temp[21][21];
bool f[21];
int ans = 0;
int sum;

void move(int dir) {

	if (dir == 1) {//down
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 20; j++)
				f[j] = false;
			for (int j = 0; j < n; j++) {
				if (map[j][i] != 0) {
					for (int k = j - 1; k >= 0; k--) {
						if (map[k][i] != 0) {
							if (map[k][i] == map[j][i]) {
								if (f[k] == false) {
									map[k][i] *= 2;
									map[j][i] = 0;
									f[k] = true;
									break;
								}
								else {
									if (k + 1 != j)
									{
										map[k + 1][i] = map[j][i];
										map[j][i] = 0;
									}
									break;
								}

							}
							else
							{
								if (k + 1 != j)
								{
									map[k + 1][i] = map[j][i];
									map[j][i] = 0;
								}
								break;

							}

						}
						else if (k == 0) {
							if (map[k][i] == 0) {
								map[k][i] = map[j][i];
								map[j][i] = 0;
								break;
							}
						}
					}

				}

			}
		}
	}
	if (dir == 2) {//up
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 20; j++)
				f[j] = false;
			for (int j = n - 1; j >= 0; j--) {
				if (map[j][i] != 0) {
					for (int k = j + 1; k < n; k++) {
						if (map[k][i] != 0) {
							if (map[k][i] == map[j][i]) {
								if (f[k] == false) {
									map[k][i] *= 2;
									map[j][i] = 0;
									f[k] = true;
									break;
								}
								else {
									if (k - 1 != j)
									{
										map[k - 1][i] = map[j][i];
										map[j][i] = 0;
									}
									break;
								}
							}
							else
							{
								if (k - 1 != j)
								{
									map[k - 1][i] = map[j][i];
									map[j][i] = 0;
								}
								break;

							}
						}
						else if (k == n - 1) {
							if (map[k][i] == 0) {
								map[k][i] = map[j][i];
								map[j][i] = 0;
								break;
							}
						}

					}

				}

			}
		}
	}
	if (dir == 3) {//LEFT
		for (int j = 0; j < n; j++) {
			for (int i = 0; i < 20; i++)
				f[i] = false;
			for (int i = 0; i < n; i++) {
				if (map[j][i] != 0) {
					for (int k = i - 1; k >= 0; k--) {
						if (map[j][k] != 0) {
							if (map[j][k] == map[j][i]) {
								if (f[k] == false) {
									map[j][k] *= 2;
									f[k] = true;
									map[j][i] = 0;
									break;
								}
								else {
									if (k + 1 != i)
									{
										map[j][k + 1] = map[j][i];
										map[j][i] = 0;
									}
									break;
								}
							}
							else
							{
								if (k + 1 != i)
								{
									map[j][k + 1] = map[j][i];
									map[j][i] = 0;
								}
								break;

							}
						}
						else if (k == 0) {
							if (map[j][k] == 0) {
								map[j][k] = map[j][i];
								map[j][i] = 0;
								break;
							}
						}

					}

				}

			}
		}
	}
	if (dir == 4) {//LEFT
		for (int j = 0; j < n; j++) {
			for (int i = 0; i < 20; i++)
				f[i] = false;
			for (int i = n - 1; i >= 0; i--) {
				if (map[j][i] != 0) {
					for (int k = i + 1; k < n; k++) {
						if (map[j][k] != 0) {
							if (map[j][k] == map[j][i]) {
								if (f[k] == false) {
									map[j][k] *= 2;
									f[k] = true;
									map[j][i] = 0;
									break;
								}
								else {
									if (k - 1 != i)
									{
										map[j][k - 1] = map[j][i];
										map[j][i] = 0;
									}
									break;
								}
							}
							else
							{
								if (k - 1 != i)
								{
									map[j][k - 1] = map[j][i];
									map[j][i] = 0;
								}
								break;

							}
						}
						else if (k == n - 1) {
							if (map[j][k] == 0) {
								map[j][k] = map[j][i];
								map[j][i] = 0;
								break;
							}
						}

					}

				}

			}
		}
	}
}



int main() {
	int tc;
	cin >> tc;
	for (int t = 1; t <= tc; t++) {
		memset(map, 0, sizeof(map));
		cin >> n;
		string m;
		cin >> m;
		int dir = 0;
		if (m == "up") {
			dir = 1;
		}
		else if (m == "down")
			dir = 2;
		else if (m == "left") {
			dir = 3;
		}
		else if (m == "right")
			dir = 4;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				cin >> map[i][j];
			}
		}
		move(dir);
		
		
		cout << '#' << t<<'\n';
		for (int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				cout << map[i][j] << " ";
			}
			cout << endl;
		}
	}
	return 0;


}

D4주기엔 좀문제가 너무쉬운게아닐까

한D2에서 3이 가장적절할듯