骑士游c ++递归

时间:2018-01-18 19:53:39

标签: c++

我尝试使用递归函数在c ++中进行骑士之旅,但是这个程序只是退出而不会多次执行该函数。主要概念就是通过跳转到任何空旷的地方并尝试前往下一个地方找到一种方法的强制方式。如果它在其中阻塞它应该只返回false并尝试下一个选项,依此类推。我完全不喜欢这种方法,还是我错过了什么?

#include <iostream>
#include <math.h>
#include <numeric>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include <stdio.h>
#include <sstream>
#include <fstream>
#include <limits>
using namespace std;

struct sah{

   int pos[8][8] = enter image description here;           //fill whole board with 0
   int x;
   int y;
   int fre=64;                      //number of free spaces on board

   bool free (int xx,int yy);

};

bool sah::free (int xx,int yy)
{

   pos[xx][yy]=1;
   for(int a=0;a!=8;a++){
      for(int b=0;b!=8;b++){
         cout<<pos[a][b]<<" ";  
      }
      cout<<endl;
   }

   if(pos[xx+2][yy-1]==0&&pos[xx+2][yy-1]!=NULL&&free(xx+2,yy-1)!=false)
      cout<<"hai";
   else if(pos[xx-2][yy-1]==0&&pos[xx-2][yy-1]!=NULL&&free(xx-2,yy-1)!=false)
      cout<<"hai";      
   else if(pos[xx+2][yy+1]==0&&pos[xx+2][yy+1]!=NULL&&free(xx+2,yy+1)!=false)
      cout<<"hai";      
   else if(pos[xx-2][yy+1]==0&&pos[xx-2][yy+1]!=NULL&&free(xx-2,yy+1)!=false)
      cout<<"hai";      
   else if(pos[xx+1][yy-2]==0&&pos[xx+1][yy-2]!=NULL&&free(xx+1,yy-2)!=false)
      cout<<"hai";      
   else if(pos[xx-1][yy-2]==0&&pos[xx-1][yy-2]!=NULL&&free(xx-1,yy-2)!=false)
      cout<<"hai";      
   else if(pos[xx+1][yy+2]==0&&pos[xx+1][yy+2]!=NULL&&free(xx+1,yy+2)!=false)
      cout<<"hai";  
   else if(pos[xx-1][yy+2]==0&&pos[xx-1][yy+2]!=NULL&&free(xx-1,yy+2)!=false)
      cout<<"hai";  
   else{
      pos[xx][yy]=0;
      cout<<"kek"<<xx<<yy;
      return false;
   }

   for(int n=0;n!=8;n++){
      for(int i=0;i!=8;i++){
         if(pos[n][i]==1)
            fre=fre-1;  
      }
   }
   cout<<fre<<" ";


}

int main(int argc, char** argv) {

   sah chess;
   chess.x=0;
   chess.y=0;
   if(chess.free(chess.x,chess.y)!=false)
      cout<<"end";

}

输出:

1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
kek00

对于对最终工作代码/解决方案感兴趣的任何人,这里是最终版本。它仍然只是一种蛮力的方法,远非最佳,但它可能有所帮助:

#include <iostream>
using namespace std;

struct chess{

    int pos[8][8] = {{0}};          //fill whole board with 0
    int x;
    int y;
    int all=0;
    int fre=64;                     //number of free spaces on board

    bool free (int xx,int yy);

};

bool chess::free (int xx,int yy)
{
    all++;

pos[xx][yy]=1;
    for(int n=0;n!=8;n++){
        for(int i=0;i!=8;i++){
            if(pos[n][i]==1)
            fre=fre-1;  
        }
    }
    cout<<endl<<endl;
    for(int a=0;a!=8;a++){
        for(int b=0;b!=8;b++){
            cout<<pos[a][b]<<" ";   
        }
        cout<<endl;
    }
    cout<<endl;

    if(pos[xx+2][yy-1]==0&&yy-1>0&&xx+2<9&&free(xx+2,yy-1)!=false)
    cout<<"success";
    else if(pos[xx-2][yy-1]==0&&xx-2>0&&yy-1>0&&free(xx-2,yy-1)!=false)
    cout<<"success";        
    else if(pos[xx+2][yy+1]==0&&yy+1<9&&xx+2<9&&free(xx+2,yy+1)!=false)
    cout<<"success";        
    else if(pos[xx-2][yy+1]==0&&yy+1<9&&xx-2>0&&free(xx-2,yy+1)!=false)
    cout<<"success";        
    else if(pos[xx+1][yy-2]==0&&xx+1<9&&yy-2>0&&free(xx+1,yy-2)!=false)
    cout<<"success";        
    else if(pos[xx-1][yy-2]==0&&xx-1>0&&yy-2>0&&free(xx-1,yy-2)!=false)
    cout<<"success";        
    else if(pos[xx+1][yy+2]==0&&yy+2<9&&xx+1<9&&free(xx+1,yy+2)!=false)
    cout<<"success";    
    else if(pos[xx-1][yy+2]==0&&yy+2<9&&xx-1>0&&free(xx-1,yy+2)!=false)
    cout<<"success";    
    else{
            if(fre==0)
            return true;
            pos[xx][yy]=0;
            cout<<"   "<<xx<<","<<yy;
            return false;
    }
}

int main(int argc, char** argv) {

    chess knight;
    knight.x=0;
    knight.y=0;
    if(knight.free(knight.x,knight.y)==true)
    cout<<endl<<endl<<endl<<knight.all;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

我注意到您的代码中存在以下错误。

  1. sha::free在结束return之前没有}声明。这是未定义行为的原因。

    当函数到达该点时,我不清楚返回值应该是false还是true

  2. 您正在使用pos[xx+2][yy-1] != NULL。看起来您正在尝试与指针进行比较,但pos[xx+2][yy-1]不是指针。这是一个整数。从你的帖子中不清楚你的目的是什么。

  3. 您正在使用无效索引访问pos,例如pos[xx+2][yy-1]pos[xx-2][yy-1,这又是未定义行为的原因。

    如果xx为6或更高,则xx+2是无效索引。如果yy为0,则yy-1是无效索引。

    我建议对索引进行以下修复。

    xx+2需要(xx+2)%8 yy-1需要(yy-1+8)%8

    xx+1xx-1xx-1yy+1yy+2yy-2需要进行类似的更改。

    您可能希望使用函数来封装逻辑。

    E.g。

    int plusIndex(x, n) { return (x+n)%8; }
    int minusIndex(x, n) { return (x-n+8)%8; }
    

    然后使用:

    // Don't use this
    // if( pos[xx+2][yy-1]==0 &&pos[xx+2][yy-1]!=NULL && free(xx+2,yy-1)!=false )
    
    // Use this.
    if ( pos[plusIndex(xx, 2)][minusIndex(yy, 1)] != 0 &&
         ...
    
  4. 您在递归调用中将无效索引传递给free。当你使用

    free(xx+2,yy-1)
    

    其中一个或两个都可能是无效索引。相反,使用

    free(plusIndex(xx, 2), minusIndex(yy, 1))
    
  5. <强>声明

    上述更改未解决您发布的代码中的任何算法错误。

答案 1 :(得分:0)

您的问题在于if条件,例如

pos[xx+2][yy-1]==0&&pos[xx+2][yy-1]!=NULL

这始终为false,因为NULL和0在此处使用它们的上下文中是等效的。所以你x == 0 and x != 0总是false