백준알고리즘

2048 (Easy)

먼지의삶 2019. 7. 31. 05:18
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdlib>
#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 sibal(char x) {
	if (x == '1')
		return 1;
	if (x == '2')
		return 2;
	if (x == '3')
		return 3;
	if (x == '4')
		return 4;
}

void go(int i,int dir) {
	if (i == 5) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (map[i][j] > ans) ans = map[i][j];
			}
		}
		if (sum < ans) sum = ans;
		ans = 0;
		return;
	}
	
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			temp[i][j] = map[i][j];
		}
	}
	move(dir);
	//if (!check()) return;
	for (int j = 1; j <= 4; j++) {
		go(i + 1, j);
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			map[i][j] = temp[i][j];
		}
	}
}
int main() {
	cin >> n;
	//t dir;
	//cin >> dir;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			ans = ans < map[i][j] ? map[i][j] : ans;
		}
	}
	
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			temp[i][j] = map[i][j];
		}
	}
	
	int tw[] = { 1,1,1,1,1 };
	
	while(true) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				map[i][j] = temp[i][j];
			}
		}
		move(tw[0]);
		move(tw[1]);
		move(tw[2]);
		move(tw[3]);
		move(tw[4]);
		
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (map[i][j] > ans) {
					ans = map[i][j];
				}
			}
		}
		tw[0]++;
		if (tw[0] > 4)
		{
			tw[0] = 1;
			tw[1]++;
			if (tw[1] > 4) {
				tw[1] = 1;
				tw[2]++;
				if (tw[2] > 4) {
					tw[2] = 1;
					tw[3]++;
					if (tw[3] > 4)
					{
						tw[3] = 1;
						tw[4]++;
						if (tw[4] > 4) {
							break;
					
						}
					}
				}
			}
		}
		
		
	}
	cout << ans << endl;
	return 0;
	

}

ㅎㅎ; 재귀로하다가 계속답안나와서 그냥 브루트포스로 하나하나 다해봤다

메인함수 조건대로 진행함