알고리즘 문제
[C/C++ 백준 1331번] 나이트 투어 (Silver 5)
새파란 공대생
2020. 7. 3. 17:10
https://www.acmicpc.net/problem/1331
1331번: 나이트 투어
나이트 투어는 체스판에서 나이트가 모든 칸을 정확히 한 번씩 방문하며, 마지막으로 방문하는 칸에서 시작점으로 돌아올 수 있는 경로이다. 다음 그림은 나이트 투어의 한 예이다. 영식이는 6×
www.acmicpc.net
생각을 안하고 코딩을 해서 큰일이다. 차근차근 짜면 풀리는 문제이다.
① 나이트 이동조건
② 제일 끝 말이 첫 번째 자리에 갈 수 있는가
③ 중복되지 않았는가
이것만 잘 따지면 쉽게 풀 수 있다.
코드는 다음과 같다.
#include <cstdio>
int main(void){
char xpos[36]={};
int ypos[36]={};
bool right=true;
for(int i=0; i<36; i++){
scanf(" %c%1d",&xpos[i],&ypos[i]);
if(i!=0){
if((xpos[i-1]+2)==xpos[i] || (xpos[i-1]-2)==xpos[i])
{
if(ypos[i-1]+1==ypos[i] || ypos[i-1]-1==ypos[i])
right = true;
else{
right = false;
break;
}
}
else if((xpos[i-1]+1)==xpos[i] || (xpos[i-1]-1)==xpos[i])
{
if(ypos[i-1]+2==ypos[i] || ypos[i-1]-2==ypos[i])
right = true;
else{
right = false;
break;
}
}
else{
right = false;
break;
}
}
if(i==35){
if((xpos[35]+2)==xpos[0] || (xpos[35]-2)==xpos[0])
{
if(ypos[35]+1==ypos[0] || ypos[35]-1==ypos[0])
right = true;
else{
right = false;
break;
}
}
else if((xpos[35]+1)==xpos[0] || (xpos[35]-1)==xpos[0])
{
if(ypos[35]+2==ypos[0] || ypos[35]-2==ypos[0])
right = true;
else{
right = false;
break;
}
}
else{
right = false;
}
}
for(int j=0; j<i; j++){
if(xpos[j]==xpos[i] && ypos[j]==ypos[i]){
right = false;
break;
}
}
if(!right)
break;
}
if(right)
printf("Valid");
if(!right)
printf("Invalid");
}
다음부턴 한번에 풀어서 한번에 맞추는 연습을 해야겠다.