2014년 7월 6일 일요일

3014 N-퍼즐

현재의 퍼즐이 정답퍼즐과 얼마나 다른가를 물어보는 문제이다.
여기서는 다른 정도를 맨해튼 거리로 표시하는데
맨해튼 거리는 순수 좌표끼리의 차이를 더한것을 거리로 삼는다.
예를들어
 (0,0) , (1,1) 의 유클리드적 거리는 루트2 지만,
맨해튼 거리는 |1-0| + |1-0| = 2  이다.
내가 이 문제를 푸는데 사용한 방법은

1. 정답퍼즐이 알파벳순서로 되어있다는것을 이용.
2. 현재 x,y 위치에 있는 알파벳과 그 알파벳의 정답 x,y좌표를 구한다.
3. 두 좌표의 맨해튼 거리를 구한다.
4. 구한 거리를 누적시킨다.

소스

이 문제를 풀면서 알아낸 신기한것.
for(;~scanf(" %c",&c);)c-='A';
알파벳의 순서를 이용하기위해 이런 방법을 사용했는데,
'.' 을 입력받는 순간부터 계산이 망가졌다.
그 이유는 c가 음수가 되면서 비트가 달라져버렸기 때문이다.
원래 char c 로 선언해서 해야했는데,
int c 로 하는 바람에 음수가 32비트에 박혀서 초기화가 되지 않았다.
역시 형변환에는 주의를 해야겠다.

댓글 없음:

댓글 쓰기