본문 바로가기

알고리즘/시뮬레이션

3190번 뱀.

하..... 변수형은 int로 써야하는걸 char로 써서 1시간을 날렸다. 오류 찾느라..... 디버깅 모드 할때 어쩐지 100 'd' 일케 되있더라 뭐지 했는데 결국 자료형의 값을 넘어서서 -127로 변해서 그런거였다. ..... 자료형 잘보자...... 그리고 코드 최적화 하자.

#include 
#include 
#include 
#include 
using namespace std;

typedef struct {
	int time;
	char dir;
}time_dir_info;

typedef struct {
	int apple_po_x;
	int apple_po_y;
}apple_po_info;

typedef struct {
	int position_x;
	int position_y;
	int dir;
}snake;

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

typedef struct {
	int pos_x;
	int pos_y;
}snake_length_detail;

int N, apple_n;
int map[100][100];
int apple_po_x, apple_po_y;
int snake_change_n, time, total_time;
char dir, cur_dir;
int cur_time;
queue q;
vector v;
queue q_s_d;
int dirx[4] = {0,0,-1, 1};
int diry[4] = {-1,1,0,0};
snake s;


void Input() {
	scanf("%d %d", &N, &apple_n);
	for (int i = 0; i < apple_n; i++) {
		scanf("%d %d", &apple_po_y, &apple_po_x);
		v.push_back({ apple_po_x-1, apple_po_y-1 });
	}
	scanf("%d", &snake_change_n);
	for (int i = 0; i < snake_change_n; i++) {
		scanf("%d %c", &time, &dir);
		q.push({ time, dir });
	}
	s.position_x = 0; s.position_y = 0; s.dir = RIGHT;
	map[0][0] = 1;
	q_s_d.push({ s.position_x,s.position_y });
}

bool apple_check(int position_x, int position_y) {
	vector::iterator iter;
	for (iter = v.begin(); iter != v.end(); ++iter) {
		if ((*iter).apple_po_x == position_x && (*iter).apple_po_y == position_y) {
			v.erase(iter);
			return true;
		}
	}
	return false;
}

void modify_position(bool flag) {
	int pos_x = q_s_d.front().pos_x;
	int pos_y = q_s_d.front().pos_y; q_s_d.pop();
	map[pos_y][pos_x] = 0;
}


bool modify_length(int dir) {
	if (map[s.position_y + diry[dir]][s.position_x + dirx[dir]] == 1) return false;
	if (!apple_check(s.position_x+dirx[dir], s.position_y+diry[dir])) {
		modify_position(true);
	}
	s.position_x += dirx[dir];
	s.position_y += diry[dir];
	map[s.position_y][s.position_x] = 1;
	q_s_d.push({ s.position_x, s.position_y });
	return true;
}

void change_dir(int dir) {
	switch (s.dir)
	{
	case UP:
		if (dir == 'D') s.dir = RIGHT;
		else s.dir = LEFT;
		break;
	case DOWN:
		if (dir == 'D') s.dir = LEFT;
		else s.dir = RIGHT;
		break;
	case LEFT:
		if (dir == 'D') s.dir = UP;
		else s.dir = DOWN;
		break;
	case RIGHT:
		if (dir == 'D') s.dir = DOWN;
		else s.dir = UP;
		break;
	default:
		break;
	}
}

void time_dir_check(int total_time) {
	if (cur_time == total_time) {
		change_dir(cur_dir);
		if (!q.empty()) {
			cur_time = q.front().time;
			cur_dir = q.front().dir; q.pop();
		}
	}
}


void Calc() {
	if (q.size() > 0) {
		cur_time = q.front().time;
		cur_dir = q.front().dir; q.pop();
	}
	while (true) {
		
		if (s.position_x < 0 || s.position_y < 0 || s.position_x >= N || s.position_y >= N) return;


		total_time++;
		if (!modify_length(s.dir)) return;

		time_dir_check(total_time);
	}
}


void Solve() {
	Input();
	Calc();
	printf("%d", total_time);
}

int main(void) {
	Solve();
	return 0;
}