본문 바로가기
CS/알고리즘

백준 1726 로봇

by zieunee 2019. 10. 3.
반응형

https://www.acmicpc.net/problem/1726

 

1726번: 로봇

많은 공장에서 로봇이 이용되고 있다. 우리 월드 공장의 로봇은 바라보는 방향으로 궤도를 따라 움직이며, 움직이는 방향은 동, 서, 남, 북 가운데 하나이다. 로봇의 이동을 제어하는 명령어는 다음과 같이 두 가지이다. 명령 1. Go k   - k는 1, 2 또는 3일 수 있다. 현재 향하고 있는 방향으로 k칸 만큼 움직인다. 명령 2. Turn dir   - dir은 left 또는 right 이며, 각각 왼쪽 또는 오른쪽으로 90° 회전한다. 공장 내 궤

www.acmicpc.net

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<queue>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
#define pii pair<pair<int,int>,pair<int,int > >

int map[105][105];
int visited[105][105][5];
int N, M;
int stx, sty, enx, eny;
int stdir, endir;
int dy[] = { 1,0,-1,0 }; //동0 남1 서2 북3 ===> 동1 서2 남3 북4 
int dx[] = { 0,1,0,-1 };
queue < pii > q;
void bfs() {

	while (!q.empty()) {
		pii p = q.front();
		q.pop();

		if (p.first.first == enx && p.first.second == eny && p.second.first == endir) {
			printf("%d", p.second.second);
			return;
		}

		//회전 
		int ndir1 = (p.second.first + 3) % 4;
		int ndir2 = (p.second.first + 1) % 4;
		if (!visited[p.first.first][p.first.second][ndir1]) {
			visited[p.first.first][p.first.second][ndir1] = 1;
			q.push({ {p.first.first,p.first.second},{ndir1,p.second.second + 1} });
		}
		if (!visited[p.first.first][p.first.second][ndir2]) {
			visited[p.first.first][p.first.second][ndir2] = 1;
			q.push({ {p.first.first,p.first.second},{ndir2,p.second.second + 1} });
		}

		//앞으로
		for (int i = 1; i <= 3; i++) {
			int nx = p.first.first + (dx[p.second.first])*i;
			int ny = p.first.second + (dy[p.second.first])*i;

			if (nx <= 0 || ny <= 0 || nx > N || ny > M || map[nx][ny] == 1) break;
			if (visited[nx][ny][p.second.first] == 1)continue;
			visited[nx][ny][p.second.first] = 1;
			q.push({ {nx,ny},{p.second.first,p.second.second + 1} });


		}

	}
}
int main() {
	scanf("%d%d", &N, &M);
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			scanf("%d", &map[i][j]);
		}
	}
	scanf("%d%d%d",& stx, &sty, &stdir);
	stdir = stdir-1;
	if (stdir == 1)
		stdir = stdir + 1;
	else if (stdir == 2) 
		stdir = stdir - 1;
	

	scanf("%d%d%d", &enx, &eny, &endir);
	endir = endir-1;
	if (endir == 1)
		endir = endir + 1;
	else if (endir == 2) 
		endir = endir - 1;

	q.push({ { stx,sty }, { stdir,0 } });

	bfs();
	
	return 0;

}

 

** 핵심

1. 동남서북

2. 방향 조절 

int dy[] = { 1,0,-1,0 }; //동0 남1 서2 북3 
int dx[] = { 0,1,0,-1 };
////처음에는 동남서북으로 선언


int ndir1 = (p.second.first + 3) % 4;
int ndir2 = (p.second.first + 1) % 4;
// 동 <-> 서 ,,, 남<-->북 일때 
반응형

'CS > 알고리즘' 카테고리의 다른 글

백준 1600 말이 되고픈 원숭이 (bfs , 사선)  (0) 2019.10.27
백준 1260 bfs 와 dfs  (0) 2019.10.27
백준 5427 불 (bfs)  (0) 2019.10.01
백준 미세먼지 안녕 17144  (0) 2019.09.27
지금까지 푼 알고리즘 문제(깃헙)  (0) 2018.11.19