分析:
看到n*n以及四个方向移动,那么就直接使用dfs即可。根据题意可知起始位置是(0,0),终点位置是(n-1,n-1)。
又有要求靶子上的箭数决定了走的路径,那么我们就要加一个判断各个方位的箭数是否符合要求。
示例代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 25;
int n,w[N],e[N],vis[N][N];
vector<int> a;
int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
bool isnmp(int x,int y){
return x>=0&&x<n&&y>=0&&y<n;
}
bool dfs(int x,int y){
if(x==n-1&&y==n-1){
for(int i=0;i<n;i++){
if(w[i]||e[i])return false;
}
return true;
}
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(!isnmp(nx,ny)||vis[nx][ny]||(nx!=n-1&&e[nx]==0)||(ny!=n-1&&w[ny]==0))continue;
vis[nx][ny]=1;
w[ny]--,e[nx]--;
a.push_back(nx*n+ny);
if(dfs(nx,ny))return true;
vis[nx][ny]=0;
w[ny]++,e[nx]++;
a.pop_back();
}
return false;
}
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin>>n;
for(int i=0;i<n;i++)cin>>w[i];
for(int j=0;j<n;j++)cin>>e[j];
vis[0][0]=1;
w[0]--,e[0]--;
a.push_back(0);
if(dfs(0,0)){
for(const auto& i : a)cout<<i<<' ';
}
return 0;
}