Posts 17837 새로운게임2 Samsung sw test
Post
Cancel

17837 새로운게임2 Samsung sw test

17837 새로운게임2 Samsung sw test

알고리즘(구현)

1
2
3
4
5
6
7
8
9
1. 색깔을 저장한 map, 말을 저장하는 3차원 배열 맵(각 칸마다 4칸만 있으면 됨), 각 칸에 말이 몇개있는지 저장하는 인덱스맵
2. 턴을 계속 진행함.
	각 말을 순차적으로 검사함. 이때 각 말들을 몇 번 검사했는지 저장하는 temp 배열을 생성.
		방향과 색깔에 맞춰 이동 시킴.
			-두번째면 그냥 넘기고 다음 거 검사
			-빨강이면 위에서부터 옆으로 이동시킴
			-흰색이면 현재 말부터 옆으로 이동시킴
			-파랑이나 맵 밖이면 방향을 바꾸고 현재말을 다시 검사함. 단, 이미 두번째 검사라면 방향은 변화시키지 않음.
			-어느 순간이든, 4개가 되면 그때의 turn을 리턴.

주의점

1
2
-파랑이나 맵 밖이면, 방향을 바꿀때, 두번째 검사라면 방향을 변화시키면 안된다.
	-> 현재거 밑에 뭔가가 있을 수 있고, 그 밑에 있는게 방향이 현재 말과 다르다면 이동 후 크게 달라질 수 있기 때문에.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <iostream>
#include <cstring>
#include <vector>
#define MAX_WIDTH 13

using namespace std;

typedef struct Piece {
	int row;
	int col;
	int direction; // 1: 오 2 : 왼 3 : 위 4 : 아
} Piece;

Piece piece[11];
int map[MAX_WIDTH][MAX_WIDTH];
int pieceMap[MAX_WIDTH][MAX_WIDTH][4];
int indexMap[MAX_WIDTH][MAX_WIDTH];
int width, numOfPiece;

int getLastTurnNum();

int main() {
	cin >> width >> numOfPiece;
	for (int i = 0; i < width; i++) {
		for (int j = 0; j < width; j++) {
			cin >> map[i][j];
		}
	}
	memset(pieceMap, -1, sizeof(pieceMap));
	memset(indexMap, 0, sizeof(indexMap));
	for (int i = 0; i < numOfPiece; i++) {
		cin >> piece[i].row >> piece[i].col >> piece[i].direction;
		piece[i].row--;
		piece[i].col--;
		pieceMap[piece[i].row][piece[i].col][indexMap[piece[i].row][piece[i].col]++] = i;
	}

	cout << getLastTurnNum();
}

int getLastTurnNum() {
	for (int turn = 1; turn <= 1000; turn++) {
		int temp[10];
		memset(temp, 0, sizeof(temp));

		for (int i = 0; i < numOfPiece; i++) {
			if (temp[i] >= 2)
				continue;
			else
				temp[i]++;

			int row = piece[i].row;
			int col = piece[i].col;
			int stackIndex = 0;
			int lastIndex = indexMap[row][col];
			for (stackIndex; stackIndex < lastIndex; stackIndex++)
				if (pieceMap[row][col][stackIndex] == i)
					break;

			if (piece[i].direction == 1) {
				if (col >= (width - 1) || map[row][col + 1] == 2) {
					if(temp[i] != 2)
						piece[i].direction = 2;
					i--;
				}
				else if (map[row][col + 1] == 1) {
					for (int j = lastIndex - 1; j >= stackIndex; j--) {
						pieceMap[row][col + 1][indexMap[row][col + 1]++] = pieceMap[row][col][j];
						if (indexMap[row][col + 1] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].col++;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
				else if (map[row][col + 1] == 0) {
					for (int j = stackIndex; j < lastIndex; j++) {
						pieceMap[row][col + 1][indexMap[row][col + 1]++] = pieceMap[row][col][j];
						if (indexMap[row][col + 1] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].col++;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
			}
			else if (piece[i].direction == 2) {
				if (col <= 0 || map[row][col - 1] == 2) {
					if (temp[i] != 2)
						piece[i].direction = 1;
					i--;
				}
				else if (map[row][col - 1] == 1) {
					for (int j = lastIndex - 1; j >= stackIndex; j--) {
						pieceMap[row][col - 1][indexMap[row][col - 1]++] = pieceMap[row][col][j];
						if (indexMap[row][col - 1] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].col--;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
				else if (map[row][col - 1] == 0) {
					for (int j = stackIndex; j < lastIndex; j++) {
						pieceMap[row][col - 1][indexMap[row][col - 1]++] = pieceMap[row][col][j];
						if (indexMap[row][col - 1] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].col--;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
			}
			else if (piece[i].direction == 3) {
				if (row <= 0 || map[row-1][col] == 2) {
					if (temp[i] != 2)
						piece[i].direction = 4;
					i--;
				}
				else if (map[row-1][col] == 1) {
					for (int j = lastIndex - 1; j >= stackIndex; j--) {
						pieceMap[row-1][col][indexMap[row-1][col]++] = pieceMap[row][col][j];
						if (indexMap[row-1][col] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].row--;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
				else if (map[row-1][col] == 0) {
					for (int j = stackIndex; j < lastIndex; j++) {
						pieceMap[row - 1][col][indexMap[row - 1][col]++] = pieceMap[row][col][j];
						if (indexMap[row - 1][col] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].row--;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
			}
			else if(piece[i].direction == 4) {
				if (row >= (width - 1) || map[row+1][col] == 2) {
					if (temp[i] != 2)
						piece[i].direction = 3;
					i--;
				}
				else if (map[row+1][col] == 1) {
					for (int j = lastIndex - 1; j >= stackIndex; j--) {
						pieceMap[row + 1][col][indexMap[row + 1][col]++] = pieceMap[row][col][j];
						if (indexMap[row + 1][col] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].row++;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
				else if (map[row+1][col] == 0) {
					for (int j = stackIndex; j < lastIndex; j++) {
						pieceMap[row + 1][col][indexMap[row + 1][col]++] = pieceMap[row][col][j];
						if (indexMap[row + 1][col] >= 4)
							return turn;
						piece[pieceMap[row][col][j]].row++;
						pieceMap[row][col][j] = -1;
						indexMap[row][col]--;
					}
				}
			}
		}
	}

	return -1;
}
This post is licensed under CC BY 4.0 by the author.

1753 최단경로

1806 partial sum

Comments powered by Disqus.