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
我正在使用回溯解决骑士之旅问题,但我没有得到想要的结果
骑士之旅蛮力
骑士之旅 - 导致无限循环,我不知道为啥