2016-06-22 3 views
0

Этот код застрял в бесконечном цикле в проблеме рыцарского тура, которую я решаю с помощью backtracking. Я использовал массив x[8] and y[8] для доступа к возможным ходам в направлениях 8. Также я сформировал эти x и y массивы так же, как и уже разрешенный ответ. Но все же есть что-то, чего я не вижу, и я не могу понять, что происходит не так.застрял в бесконечной петле в обратном трафике рыцаря

#include<stdio.h> 
int x[8] = { 2, 1, -1, -2, -2, -1, 1, 2 }; 
int y[8] = { 1, 2, 2, 1, -1, -2, -2, -1 }; 
int sol[100][100]={0}; 
int isvalid(int i,int j,int n) 
{ 
    if(i>=0&&j>=0&&i<n&&j<n) 
    { 
     if(sol[i][j]==0) 
     return 1; 
     else 
     return 0; 
    } 
    return 0; 
} 
int solvekt(int i,int j,int k,int n) 
{ 
    printf("i=%d j=%d k=%d\n",i,j,k); 
    if(k==n*n+1) 
    return 1; 
    int m,i1,j1,ans=0; 
    for(m=0;m<8;m++) 
    { 
     i1=i+x[m]; 
     j1=j+y[m]; 
     if(isvalid(i1,j1,n)) 
     { 
      printf("i=%d j=%d i1=%d j1=%d k=%d\n",i,j,i1,j1,k); 
      sol[i1][j1]=k; 
      ans=solvekt(i1,j1,k+1,n); 
      if(ans)return 1; 
      else 
      sol[i1][j1]=0; 
     } 
    } 
    return 0; 
} 
int main() 
{ 
    int n=6,i,j; 
    sol[0][0]=1; 
    if(!solvekt(0,0,2,n))printf("not possible\n"); 
    else 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<n;j++) 
     printf("%d ",sol[i][j]); 
     printf("\n"); 
    } 
    return 0; 
} 
+0

У вас есть какие-то отпечатки, так что ты видишь? –

+0

Значимые переменные и имена параметров будут иметь большое значение для упрощения понимания кода. –

+1

Вы уверены, что находитесь в * бесконечном цикле, а не просто в * длительном цикле? –

ответ

3

ОП был нетерпелив. Код в порядке, просто потребовалось некоторое время.

«Вы уверены, что в бесконечном цикле, а не просто затянувшийся цикл?» @John Bollinger

Чтобы запустить быстрее, опускаем отладки печатает @Weather Vane

+0

С' n == 5', примерно в 50 раз быстрее. Начните с малого, а затем поднимитесь. – chux