题解代码:
#include<bits/stdc++.h>
using namespace std;
struct zuobiao{
int fir;
int sec;
};
vector<zuobiao> cunchu;
int n;
const int N=25;
bool f[N][N];
int xjian[N];
int yjian[N];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};//右下左上
int check(int x,int y){
if(x==n&&y==n){
for(int i=1;i<=n;i++){
if(xjian[i]!=0) return 1;
}
for(int i=1;i<=n;i++){
if(yjian[i]!=0) return 1;
}
for(int i=0;i<cunchu.size();i++){
int xt=cunchu[i].fir;
int yt=cunchu[i].sec;
int sum=n*(yt-1)+xt-1;
cout<<sum<<" ";
}
return 1;
}
return 0;
}
int pd(int x,int y){
if(f[x][y]==true) return 0;
else if(x<1) return 0;
else if(y<1) return 0;
else if(x>n) return 0;
else if(y>n) return 0;
else if(xjian[x]<=0)return 0;
else if(yjian[y]<=0)return 0;
else return 1;
}
void dfs(int x,int y){
if(check(x,y)){
return ;
}
else{
for(int i=0;i<4;i++){
int xx=dx[i]+x;
int yy=dy[i]+y;
if(pd(xx,yy)){
cunchu.push_back({xx,yy});
xjian[xx]--;
yjian[yy]--;
f[xx][yy]=true;
dfs(xx,yy);
//回溯后复原现场
cunchu.pop_back();
f[xx][yy]=false;
xjian[xx]++;
yjian[yy]++;
}
else continue;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>xjian[i];
}
for(int i=1;i<=n;i++){
cin>>yjian[i];
}
xjian[1]--;
yjian[1]--;
f[1][1]=true;
cunchu.push_back({1,1});
dfs(1,1);
return 0;
}