c_cpp 骑士之旅(回溯)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 骑士之旅(回溯)相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

// #Backtracking #BasicProblem

int valid(int x,int y,vector< vector<int> > a){
    int n=a.size();
    if(x>=0 && x<n && y>=0 && y<n && a[x][y]==0){
        return 1;
    }else{
        return 0;
    }
}
int bt(vector< vector<int> > &a,int x,int y,int &moves){
    int n=a.size();
    if(valid(x,y,a)==1){
        if(moves==(n*n)){
            a[x][y]=moves;
            return 1;
        }
        a[x][y]=moves;
        moves++;
        if(bt(a,x+1,y+2,moves)==1){
            return 1;
        }else if(bt(a,x+1,y-2,moves)==1){
            return 1;
        }else if(bt(a,x+2,y+1,moves)==1){
            return 1;
        }else if(bt(a,x+2,y-1,moves)==1){
            return 1;
        }else if(bt(a,x-1,y+2,moves)==1){
            return 1;
        }else if(bt(a,x-1,y-2,moves)==1){
            return 1;
        }else if(bt(a,x-2,y+1,moves)==1){
            return 1;
        }else if(bt(a,x-2,y-1,moves)==1){
            return 1;
        }else{
            moves--;
            a[x][y]=0;
            return 0;
        }
    }
    return 0;
}
void solve(int n){
    vector< vector<int> > a(n);
	for(int i=0;i<n;i++){
	    a[i].resize(n);
	}
    int moves=1;
	 if(bt(a,0,0,moves)==0){
	     cout<<moves<<endl;
	     cout<<"No solution"<<endl;
	 }else{
	     cout<<moves<<endl;
	     for(int i=0;i<n;i++){
	        for(int j=0;j<n;j++){
	            cout<<a[i][j]<<" ";
	        }
	        cout<<endl;
	    }
	 }
	    
}

int main() {
	int t;
	cin>>t;
	while(t--){
	    int n;
	    cin>>n;
	    solve(n);
	}
	return 0;
}

以上是关于c_cpp 骑士之旅(回溯)的主要内容,如果未能解决你的问题,请参考以下文章

带回溯的骑士​​之旅

c ++中的递归回溯骑士之旅

c_cpp 骑士的旅游问题|回溯-1

我正在使用回溯解决骑士之旅问题,但我没有得到想要的结果

骑士之旅蛮力

骑士之旅 - 导致无限循环,我不知道为啥