思路:
DFS,没走到一个位置,就将对应的左侧和上面的两个数组的个数减1,看看到达终点的时,两个数组是否都为0
//路径之谜
#include<iostream>
#include<vector>
using namespace std;
int n;//n行n列
int a[25],b[25];// 左面的靶数 上面的靶数
int vis[25][25];
vector<int> path;//记录路径
int d[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
void dfs(int x,int y){
if(a[x]<0 || b[y]<0) return;
if(x==n-1 && y==n-1) //结束条件
{
int ok=1;
for(int i=0;i<n;i++)
if(a[i]!=0 ||b[i]!=0){
ok=0;//和靶的轨迹不重合 不是我们要的
break;
}
if(ok) //输出路径
for(int i=0;i<path.size();i++)
cout<<path[i]<<" ";
}
for(int i=0;i<4;i++){
int tx=x+d[i][0],ty=y+d[i][1];
if(vis[tx][ty]==0 &&tx>=0 && ty>=0 && tx<n && ty<n){
vis[tx][ty]=1;
path.push_back(tx*n+ty);//从第0行开始算起,不是第一行
a[tx]--;
b[ty]--;
dfs(tx,ty);
//不成功的回溯操作
path.pop_back();
a[tx]++;
b[ty]++;
vis[tx][ty]=0;
}
}
}
int main(){
cin>>n; //n*n的方格
for(int i=0;i<n;i++) cin>>b[i];
for(int j=0;j<n;j++) cin>>a[j];
path.push_back(0);
vis[0][0]=1;
a[0]--;
b[0]--;
dfs(0,0);
return 0;
}