C++기사 바둑판 알고리즘 실현

3256 단어 C++바둑판
본 논문 의 사례 는 C++기사 가 바둑판 알고리즘 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
1.문제 설명
기사 여행 Knight tour 는 18 세기 초 에 수학자 와 퍼 즐 팬 들 의 주 의 를 받 았 다.기사 들 의 걷 는 방법 은 서양 바둑 의 걷 는 방법 이 었 다.기 사 는 어떤 위치 에서 출발 할 수 있 고 모든 위 치 를 어떻게 다 가 야 하 는 지 알 수 있 었 다.
2.기본 적 인 사고방식
기사의 방법 은 기본적으로 배달 로 해결 할 수 있 지만 순수한 배달 은 차원 이 넓 을 때 상당히 비효 율 적 이다.똑똑 한 해법 은 J.C.Warnsdorff 가 1823 년 에 제기 했다.쉽게 말 하면 가장 어 려 운 위 치 를 먼저 걷 고 그 다음 의 길 은 넓 어 진다.기사 가 원 하 는 다음 단 계 는 다음 에 선택 하지 않 을 때 걸 을 수 있 는 걸음 수가 가장 적다.이 방법 을 사용 하면 반송 을 사용 하지 않 는 상황 에서 비교적 높 은 확률 로 주 법 을 찾 을 수 있다.
3.코드 구현

#include <stdio.h>
 
int pos[8][8] = { 0 };
 
int travel(int, int);
 
int travel(int x, int y) {
 int i, j, k, l, m;
 int tmpX, tmpY;
 int count, min, tmp;
 
 //         (   )
 int ktmoveX[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
 int ktmoveY[8] = { -2, -1, 1, 2, 2, 1, -1, -2 };
 
 //       
 int nextX[8] = { 0 };
 int nextY[8] = { 0 };
 
 //            
 int exists[8] = { 0 };
 
 //   1    
 i = x;
 j = y;
 pos[i][j] = 1;
 
 //    
 for (m = 2; m <= 64; m++) {
  //           
  for (l = 0; l < 8; l++) {
   exists[l] = 0;
  }
  l = 0; //      
 
      //      
  for (k = 0; k < 8; k++) {
   tmpX = i + ktmoveX[k];
   tmpY = j + ktmoveY[k];
   //     
   if (tmpX < 0 || tmpY < 0 || tmpX>7 || tmpY>7) {
    continue;
   }
   //     
   if (pos[tmpX][tmpY] == 0) {
    nextX[l] = tmpX;
    nextY[l] = tmpY;
    l++;    //     1
   }
  }
  count = l;
  //       
  if (count == 0) {
   return 0;
   //         
  }
  else if (count == 1) {
   min = 0;
   //          
  }
  else {
   for (l = 0; l < count; l++) {
    for (k = 0; k < 8; k++) {
     tmpX = nextX[l] + ktmoveX[k];
     tmpY = nextY[l] + ktmoveY[k];
     if (tmpX < 0 || tmpY < 0 || tmpX>7 || tmpY>7) {
      continue;
     }
     if (pos[tmpX][tmpY] == 0) {
      exists[l]++;
     }
    }
   }
   //             
   min = 0;
   tmp = exists[0];
   for (l = 0; l < count; l++) {
    if (exists[l] < tmp) {
     tmp = exists[l];
     min = l;
    }
   }
  }
  //          
  i = nextX[min];
  j = nextY[min];
  pos[i][j] = m;
 }
 return 1;
}
 
int main()
{
 int i, j, startX, startY;
 while (1)
 {
  printf("     :");
  scanf("%d%d", &startX, &startY);
  if (travel(startX, startY)) {
   printf("    !
"); } else { printf(" !
"); } for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { printf("%2d ", pos[i][j]); } printf("
"); } printf("
"); } return 0; }
4.567916.이상 은 본 고의 전체 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 지지 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기