#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
typedef vector<vector<int> > Chess;
int num=1;
//八种跳法判断哪一种可行:不出界,不踏入已经来过的地方
bool can(int k,int i,int j,const Chess& chess){
    switch(k){
    case 0:i=i+1,j=j+2;break;
    case 1:i=i-1,j=j+2;break;
    case 2:i=i-2,j=j+1;break;
    case 3:i=i-2,j=j-1;break;
    case 4:i=i-1,j=j-2;break;
    case 5:i=i+1,j=j-2;break;
    case 6:i=i+2,j=j-1;break;
    case 7:i=i+2,j=j+1;break;
    }
    return (i>-1&&i<8&&j>-1&&j<8&&chess[i][j]==0);//chess[il[j]==0,表示这个位置还没来过
}
//若八种跳法都不行,则return true
bool cannot(int i,int j,const Chess& chess){
    for(int k=0;k<8;k++)
        if(can(k,i,j,chess)) break;
    return (k==8);
}

//跳一步
void go(Chess& chess,int& k,int& i,int&j){
    switch(k){
    case 0:i=i+1,j=j+2;break;
    case 1:i=i-1,j=j+2;break;
    case 2:i=i-2,j=j+1;break;
    case 3:i=i-2,j=j-1;break;
    case 4:i=i-1,j=j-2;break;
    case 5:i=i+1,j=j-2;break;
    case 6:i=i+2,j=j-1;break;
    case 7:i=i+2,j=j+1;break;
    }
    chess[i][j]=++num;
}
//不成功则回退
void retreat(Chess& chess,int k,int& i,int& j){
    chess[i][j]=0;
    switch(k){
    case 0:i=i-1,j=j-2;break;
    case 1:i=i+1,j=j-2;break;
    case 2:i=i+2,j=j-1;break;
    case 3:i=i+2,j=j+1;break;
    case 4:i=i+1,j=j+2;break;
    case 5:i=i-1,j=j+2;break;
    case 6:i=i-2,j=j+1;break;
    case 7:i=i-2,j=j-1;break;
    }
    num--;
}
//如果棋盘所有地方都走过,则return true
bool complete(const Chess& chess){
    int i,j;
    for(i=0;i<8;i++)
        for(j=0;j<8;j++)
            if (chess[i][j]==0)break;
        
    return (i==8&&j==8);
    

}

bool run(Chess& chess,int& i,int& j, bool& done){
    if(cannot(i,j,chess)){
        if (complete(chess)) done=true;
        else done=false;//如果再也不能走了,就检查一下棋盘是否走遍,如果不是则失败,反之成功
    }
    else {
        
        for (int k=0;k<8;k++){
            if(can(k,i,j,chess)) {
                go(chess,k,i,j);
                run(chess,i,j,done);
                if(done==false){retreat(chess,k,i,j);continue;}
                else break;
            }
        }
    }
    return done;
}
            

int main()
{
    Chess chess(8,vector<int>(8,0));
    int a,b;
    bool done=true;
    cout<<"please enter a and b:"<<endl;
    cin>>a>>b;
    a--;b--;
    chess[a][b]=1;
    run(chess,a,b,done);
    
    for(int i=0;i<8;i++){
        for(int j=0;j<8;j++)
            cout<<setw(6)<<chess[i][j];
            cout<<endl;
        }
    cout<<endl<<endl<<endl;
    cin>>a;
    return 0;
}

不知是我错了还是马本来就无法走全的