알고리즘 문제

[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");
}

다음부턴 한번에 풀어서 한번에 맞추는 연습을 해야겠다.