分析:
看到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;
}