01-29 07:13
Recent Posts
Recent Comments
관리 메뉴

너와나의 관심사

2048 쉬운 버전의 문제 본문

카테고리 없음

2048 쉬운 버전의 문제

벤치마킹 2018. 2. 4. 16:49

2048  문제를 풀일이 있어서 좀 수정된 (쉬운 버전의 문제를 풀어 보았다..) 

단순한 자료 구조 (배열정리) 문제에 대한 해답을 정확히 찾지 못해 .. 고생하였다.


아래와 같은 문제인데.. up/down/right/left 의 순의로 같은 값을 더해 나가는것인데 

 방향에 따라 같은 값이 배열 옆으로 있으면 두배 해주고 0으로 만들어 주고 2칸 뛰어 넘고 

만약 다음 자리에 0이면 j  값을 index 사용해서 값을 이동하고 다시 0으로 만들어준다






#include  
#include  
using namespace std;


#define MAX 10001

int N;
bool visit[21][21];
int  board[21][21];
int  queue[21];

char dir[10];
int d;

/*
typedef enum {
RIGHT = 0,
LEFT,
UP,
DOWN
}Dir;

*/

enum {
	RIGHT = 0,
	LEFT,
	UP,
	DOWN
};

int c_d(char a){

	int ret;

	switch (a){
	case 'r':
		ret = RIGHT;
		break;
	case 'l':
		ret = LEFT;
		break;

	case 'u':
		ret = UP;
		break;

	case 'd':
		ret = DOWN;
		break;

	default:
		break;
	}

	return ret;
}

void zero_padding(int start){

	for (int i = start; i < N; i++)
		queue[i] = 0;
}

void queueing(void){

	int i, j;
	j = 0;
	
	for (i = 0; i < N; i++) {

		if (queue[i] == 0)
			continue;
		else
			queue[j++] = queue[i];
	}

	//j 부터 모두 zero setting 
	zero_padding(j);

	j = 0;
	for (i = 0; i < N; i++){
		if (queue[i] == 0)
			continue;

		if (queue[i] == queue[i + 1]) {
			queue[j] = queue[i] * 2;
			queue[i+1] = 0;

			i++, j++;


		}
		else {
			queue[j] = queue[i];
			if (i != j)
				queue[i] = 0;

			j++;

		}
	}

	zero_padding(j);

}

void print_result()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
			cout << board[i][j] << " ";

		cout << endl;

	}
}

void solve(void){

	int i, j, k;
	int d_ret = c_d(dir[0]);

	if (d_ret == LEFT){

		for (i = 0; i < N; i++){
			k = 0;

			for (j = 0; j < N; j++)
				queue[k++] = board[i][j];

			queueing();

			k = 0;
			for (j = 0; j < N; j++)
				board[i][j] = queue[k++];
		}

	}
	else if (d_ret == RIGHT){
		for (i = 0; i < N; i++){

			k = 0;
			for (j = N - 1; j >= 0; j--)
				queue[k++] = board[i][j];

			queueing();

			k = 0;
			for (j = N - 1; j >= 0; j--)
				board[i][j] = queue[k++];


		}
	}
	else if (d_ret == UP){
		for (i = 0; i < N; i++){

			k = 0;
			for (j = 0; j < N; j++)
				queue[k++] = board[j][i];

			queueing();

			k = 0;
			for (j = 0; j < N; j++)
				board[j][i] = queue[k++];
		}

	}
	else if (d_ret == DOWN){
		for (i = 0; i < N; i++){

			k = 0;
			for (j = N - 1; j >= 0; j--)
				queue[k++] = board[j][i];

			queueing();

			k = 0;
			for (j = N - 1; j >= 0; j--)
				board[j][i] = queue[k++];

		}
	}
}

int main(void)
{
	int test_case;
	int T;
	int i, j;
	
	freopen("input.txt", "r", stdin);  setbuf(stdout, NULL);

	T = 1;
	scanf("%d", &T);

	for (test_case = 1; test_case <= T; ++test_case)
	{
		scanf("%d %s", &N, dir);

		for (i = 0; i < N; i++)
		for (j = 0; j < N; j++)
			scanf("%d", &board[i][j]);

		printf("#%d\n", test_case);

		solve();
		print_result();
	}

	return 0;
}


Comments