ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;
    	
    
    }

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

    메인함수 조건대로 진행함

    '백준알고리즘' 카테고리의 다른 글

    미로탐색  (0) 2019.08.01
    낚시왕  (0) 2019.08.01
    알파벳  (0) 2019.07.31
    N-Queen  (0) 2019.07.30
    부등호  (0) 2019.07.30

    댓글

Designed by Tistory.