//https://www.acmicpc.net/problem/3190 #include <iostream> | |
#include <queue> | |
#include <utility> | |
using namespace std; | |
int N, K, L; | |
int map[100][100]; | |
//머리의 방향 | |
#define UP 0 | |
#define RIGHT 1 | |
#define DOWN 2 | |
#define LEFT 3 | |
//머리의 방향에 따른 다음 이동 방향 | |
//UP일 때, ny=y+dy[0], nx=x+dx[0]... | |
int dy[4]={-1,0,1,0}; | |
int dx[4]={0,1,0,-1}; | |
//뱀 몸통은 큐를 이용 | |
//사과를 먹지않으면 꼬리(=front, 제일 처음 집어넣은 값) pop | |
//매초 이동시에 머리(=back, 제일 마지막에 집어넣은 값) push | |
queue<pair <int, int> > snake; | |
int main(){ | |
cin >> N >> K; | |
map[0][0]=1;//뱀 초기 위치 | |
snake.push(make_pair(0,0)); | |
bool chk=0; | |
for(int i=0; i<K; i++){ | |
int y, x; | |
cin >> y >> x; | |
map[y-1][x-1]=2;//사과가 존재함 | |
//주어진 문제는 (1,1)~(N,N) 의 맵 | |
//0,0에서 시작하고 사과의 위치를 -1,-1씩 옮겨줌 | |
} | |
cin >> L; | |
int t; | |
int D=RIGHT;//뱀의 머리 방향, 최초에 오른쪽 | |
char dir; | |
int tmp=0;//시간 진행 체크 | |
for(int i=0; i<L; i++){ | |
cin >> t >> dir; | |
for(; tmp<t; tmp++){ //현재 시간<다음 머리 방향 바꾸는 시간 | |
int ny=snake.back().first+dy[D]; | |
int nx=snake.back().second+dx[D]; | |
if(ny<0 || ny>=N ||nx <0 || nx>=N || map[ny][nx]==1) { | |
chk=1; | |
tmp++; | |
break; | |
//벽이나 몸통에 부딪히면 break; | |
} | |
if(map[ny][nx]==2){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
//사과를 먹은 경우, 머리만 이동해줌, 머리 부분은 1로 바꾸기 | |
} | |
else if(map[ny][nx]==0){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
map[snake.front().first][snake.front().second]=0; | |
snake.pop(); | |
//빈 공간일 경우, 머리를 이동해주고, 꼬리를 땡김 | |
//pop이 꼬리부분 땡기는 것(큐 젤 앞에 있는 것 삭제) | |
//꼬리를 땡긴 부분은 0으로 map을 바꿔줌 | |
} | |
} | |
if(chk==0) tmp=t; | |
//t-1초까지 뱀의 이동을 해주었다면, t 초에 머리 방향을 바꿔줌 | |
if(dir=='D'){ | |
D=(D+1)%4; | |
} | |
else if(dir=='L'){ | |
D=(D+3)%4; | |
} | |
if(chk) break; | |
} | |
while(!chk){ | |
int ny=snake.back().first+dy[D]; | |
int nx=snake.back().second+dx[D]; | |
if(ny<0 || ny>=N ||nx <0 || nx>=N || map[ny][nx]==1) { | |
//벽 또는 몸통에 부딪히면 | |
chk=1; | |
tmp++; | |
break; | |
} | |
if(map[ny][nx]==2){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
} | |
else if(map[ny][nx]==0){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
map[snake.front().first][snake.front().second]=0; | |
snake.pop(); | |
} | |
tmp++; | |
} | |
cout << tmp; | |
return 0; | |
} |
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
180410_2161_카드1 (0) | 2018.04.10 |
---|---|
180409_카드 카운팅 (0) | 2018.04.09 |
180407_14503_로봇청소기 (0) | 2018.04.07 |
180407_13460_째로탈출 2 (0) | 2018.04.07 |
180406_14716_현수막 (0) | 2018.04.07 |
//https://www.acmicpc.net/problem/3190 #include <iostream> | |
#include <queue> | |
#include <utility> | |
using namespace std; | |
int N, K, L; | |
int map[100][100]; | |
//머리의 방향 | |
#define UP 0 | |
#define RIGHT 1 | |
#define DOWN 2 | |
#define LEFT 3 | |
//머리의 방향에 따른 다음 이동 방향 | |
//UP일 때, ny=y+dy[0], nx=x+dx[0]... | |
int dy[4]={-1,0,1,0}; | |
int dx[4]={0,1,0,-1}; | |
//뱀 몸통은 큐를 이용 | |
//사과를 먹지않으면 꼬리(=front, 제일 처음 집어넣은 값) pop | |
//매초 이동시에 머리(=back, 제일 마지막에 집어넣은 값) push | |
queue<pair <int, int> > snake; | |
int main(){ | |
cin >> N >> K; | |
map[0][0]=1;//뱀 초기 위치 | |
snake.push(make_pair(0,0)); | |
bool chk=0; | |
for(int i=0; i<K; i++){ | |
int y, x; | |
cin >> y >> x; | |
map[y-1][x-1]=2;//사과가 존재함 | |
//주어진 문제는 (1,1)~(N,N) 의 맵 | |
//0,0에서 시작하고 사과의 위치를 -1,-1씩 옮겨줌 | |
} | |
cin >> L; | |
int t; | |
int D=RIGHT;//뱀의 머리 방향, 최초에 오른쪽 | |
char dir; | |
int tmp=0;//시간 진행 체크 | |
for(int i=0; i<L; i++){ | |
cin >> t >> dir; | |
for(; tmp<t; tmp++){ //현재 시간<다음 머리 방향 바꾸는 시간 | |
int ny=snake.back().first+dy[D]; | |
int nx=snake.back().second+dx[D]; | |
if(ny<0 || ny>=N ||nx <0 || nx>=N || map[ny][nx]==1) { | |
chk=1; | |
tmp++; | |
break; | |
//벽이나 몸통에 부딪히면 break; | |
} | |
if(map[ny][nx]==2){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
//사과를 먹은 경우, 머리만 이동해줌, 머리 부분은 1로 바꾸기 | |
} | |
else if(map[ny][nx]==0){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
map[snake.front().first][snake.front().second]=0; | |
snake.pop(); | |
//빈 공간일 경우, 머리를 이동해주고, 꼬리를 땡김 | |
//pop이 꼬리부분 땡기는 것(큐 젤 앞에 있는 것 삭제) | |
//꼬리를 땡긴 부분은 0으로 map을 바꿔줌 | |
} | |
} | |
if(chk==0) tmp=t; | |
//t-1초까지 뱀의 이동을 해주었다면, t 초에 머리 방향을 바꿔줌 | |
if(dir=='D'){ | |
D=(D+1)%4; | |
} | |
else if(dir=='L'){ | |
D=(D+3)%4; | |
} | |
if(chk) break; | |
} | |
while(!chk){ | |
int ny=snake.back().first+dy[D]; | |
int nx=snake.back().second+dx[D]; | |
if(ny<0 || ny>=N ||nx <0 || nx>=N || map[ny][nx]==1) { | |
//벽 또는 몸통에 부딪히면 | |
chk=1; | |
tmp++; | |
break; | |
} | |
if(map[ny][nx]==2){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
} | |
else if(map[ny][nx]==0){ | |
snake.push(make_pair(ny, nx)); | |
map[ny][nx]=1; | |
map[snake.front().first][snake.front().second]=0; | |
snake.pop(); | |
} | |
tmp++; | |
} | |
cout << tmp; | |
return 0; | |
} |
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
180410_2161_카드1 (0) | 2018.04.10 |
---|---|
180409_카드 카운팅 (0) | 2018.04.09 |
180407_14503_로봇청소기 (0) | 2018.04.07 |
180407_13460_째로탈출 2 (0) | 2018.04.07 |
180406_14716_현수막 (0) | 2018.04.07 |