Skiena, Programming Challenges에서이 책을 읽었으며 백 트랙 장 이후 15 트랙을 백 트랙킹으로 해결하는 것에 대한 질문이 생겼습니다.이를 8 퍼즐로 줄여 실험했습니다. 이 재귀 코드가 있으며 솔루션을 찾을 수있는 기회가 있는지 궁금합니다. 해결책을 찾기 위해이 코드 기회가와 초, 퍼즐은 적절한 시간에 사람 해결할 수있는 방법,8 Backtracking을 사용한 퍼즐
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int arr[20][20]={
{3,1,2},
{4,0,5},
{6,8,7}
};
int moveX[20]={1,1,1,0,0,-1,-1,-1};
int moveY[20]={0,1,-1,1,-1,0,1,-1};
int depth=0;
int findRow(){
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(arr[i][j]==0){
return i;
}
}
}
}
int findCol(){
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(arr[i][j]==0){
return j;
}
}
}
}
void print(){
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%i ",arr[i][j]);
}
printf("\n");
}
printf("\n");
}
int isReady(){
if(arr[0]==1 && arr[1]==2 && arr[2]==3 && arr[3]==4 && arr[4]==5 && arr[5]==6 && arr[6]==7 && arr[7]==8){
return 1;
}
else return 0;
}
void perm(int row,int col,int n){
if(n>=9){
print();
if(isReady())
printf("Finished");
depth++;
return;
}
int i=0;int diffX,diffY,temp;
int r=findRow();
int c=findCol();
temp=arr[r][c];
arr[r][c]=arr[row][col];
arr[row][col]=temp;
for(i=0;i<8;i++){
diffX=row+moveX[i];
diffY=col+moveY[i];
if(diffX>=0 && diffX<4 && diffY>=0 && diffY<4){
perm(diffX,diffY,n+1);
}
}
temp=arr[r][c];
arr[r][c]=arr[row][col];
arr[row][col]=temp;
}
int main()
{
perm(0,0,0);
return 0;
}
내 질문은 : 코드는 추한은 (경고)의 종류는?
실행하여 사용해보십시오. –
글쎄, 그것이 작동하지 않습니다, 그것은 쓰여진 15 퍼즐에 대한 50 단계의 해결책을 찾을 수 있지만, 웹에서 아무것도 찾을 수 없습니다. –
그러면 * 어떻게 * 작동하지 않습니까? 자세한 내용은 문제에 관해 우리에게 더 잘 알려줄 수 있습니다. 예를 들어, 빌드합니까? 그렇지 않다면 * complete * 빌드 로그를 포함하도록 질문을 편집하십시오. 그것은 추락합니까? 그런 다음 디버거에서 실행하고 최소한 함수 호출 스택을 제공하십시오. 잘못된 결과가 나옵니까? 그런 다음 특정 입력에 대해 * actual * 및 * expected * 출력은 무엇입니까? 우리는이 많은 코드를 읽는 것을 기대할 수 없습니다 (문제가있는 부분까지 좁혀주십시오). 확실히 실행하지 마십시오. –