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");
}
다음부턴 한번에 풀어서 한번에 맞추는 연습을 해야겠다.
'알고리즘 문제' 카테고리의 다른 글
| [C/C++ 백준 1475번] 방 번호 (Silver 5) (0) | 2020.07.07 |
|---|---|
| [C/C++ 백준 1476번] 날짜 계산 (Silver 5) (0) | 2020.07.07 |
| [C/C++ 백준 1788번] 피보나치 수의 확장 (Silver 2) (0) | 2020.07.03 |
| [C/C++ 백준 5623번] 수열의 합 (Silver 5) (0) | 2020.07.02 |
| [C/C++ 백준 1448번] 삼각형 만들기 (Silver 3) (0) | 2020.07.02 |