- 문제 설명
우회전밖에 할 수 없는 차가 있다.
목표 순서가 정해지면 목표지점을 다 순회하는데 우회전을 몇번 해야하는가
|
|
|
|
|
|
|
1 |
|
|
|
|
|
3 |
|
|
2 |
|
|
|
|
|
|
|
|
위와 같은 맵의 경우
|
|
R |
|
|
|
|
1 |
|
|
|
R |
|
3 |
|
|
2, R |
R |
|
|
|
|
|
|
|
위와 같이 총 4번의 우회전을 해야 목적지를 다 돌 수 있다.
- 입력
1 // 테스트 케이스
5 3 // 5*5배열, 목적지 3개
2 3 4 2 3 4// 목적지 좌표 (2,3), (4,2), (3,4)
- 출력
#1 4 //테스트 케이스, 우회전 갯수
- 입력 예시
3
5 3
2 3 4 2 3 4
5 4
3 2 2 4 4 3 5 2
5 5
2 4 3 2 2 3 4 4 5 5
- 출력 예시
#1 4
#2 10
#3 9
- 코드
#include "stdio.h"
int N, locationNum;
int currentLocation;
int main(int argc, const char * argv[]) {
int T;
freopen("/Users/wjhur/Desktop/ctest/ctest/Text.txt", "r", stdin);
scanf("%d", &T);
for(int tc = 1;tc <= T;tc++)
{
scanf("%d %d",&N, &locationNum);
int currentCol=1;
int currentRow=1;
int countOfR = 0;
int way = 0; // 현재 진행방향 0 : ->, 1: 아래, 2: <-, 3:위
for(int i =0;i<locationNum;i++)
{
int inputCol, inputRow;
scanf("%d %d",&inputCol, &inputRow);
// printf("inputCol = %d, inputRow = %d,way = %d,countOfR = %d\n",inputCol,inputRow,way,countOfR);
if(currentCol == inputCol) // 같은 행일 경우
{
if(currentRow > inputRow) //현재 위치보다 왼쪽인 경우
{
if(way == 0 || way == 3)
{
currentCol++;
}
else if(way == 1)
{
currentCol--;
}
}
else // 현재 위치 보다 오른쪽인 경우
{
if(way == 1 || way == 3)
{
currentCol++;
}
else if(way == 2)
{
currentCol--;
}
}
}
else if(currentRow == inputRow) // 같은 열일때
{
if(currentCol > inputCol) // 현재 위치 보다 위인 경우
{
if(way == 0 || way == 1)
{
currentRow--;
}
else if(way == 2)
{
currentRow++;
}
}
else // 현재 위치 보다 아래인 경우
{
if(way == 0)
{
currentRow--;
}
else if(way == 2 || way == 3)
{
currentRow++;
}
}
}
if(currentCol < inputCol && currentRow < inputRow) // 우측 아래 일 경우
{
// printf("1- way%%4 = %d\n",1-way%4);
int cal = 1 - (way%4);
cal = (cal > 0) ? cal : (4+cal);
countOfR += cal;
way = 1; // 마지막 방향은 아래를 향함
}
else if(currentCol < inputCol && currentRow > inputRow) // 좌측 아래일 경우
{
// printf("2- way%%4 = %d\n",2-way%4);
int cal = 2 - (way%4);
cal = (cal > 0) ? cal :(4+cal);
countOfR += cal;
way =2; // 마지막 방향은 왼쪽을 향함
}
else if(currentCol > inputCol && currentRow > inputRow) // 좌측 위일 경우
{
// printf("3- way%%4 = %d\n",3-way%4);
int cal = 3 - (way%4);
cal = (cal > 0) ? cal : (4+cal);
countOfR += cal;
way =3; // 마지막 방향은 위를 향함
}
else if(currentCol > inputCol && currentRow < inputRow)// 우측 위일 경우
{
// printf("4- way%%4 = %d\n",4-way%4);
int cal = 4-(way%4);
cal = (cal > 0) ? cal : (4+cal);
countOfR += cal;
way =0; // 마지막 방향은 오른쪽을 향함
}
// 현재위치 갱신
currentCol = inputCol;
currentRow = inputRow;
}
printf("#%d %d\n", tc,countOfR); // 결과 출력
}
return 0;
}
'교육 > 문제해결' 카테고리의 다른 글
[8일차][다익스트라] 최단거리 (0) | 2017.09.06 |
---|---|
[7일차][최소신장트리] 최소신장트리 (0) | 2017.09.05 |
[5일차][그래프] 최소동전 갯수 (0) | 2017.09.04 |
[6일차][미로] 주어진 숫자 순서 찾기 (0) | 2017.09.04 |
[6일차][미로] 최소합 구하기 (0) | 2017.09.04 |