题目链接:1.路径之谜 - 蓝桥云课 (lanqiao.cn)
题意:本题读好久才明白让干啥,就是每行每列走固定的次数,让你输出路径
思路:数据量很小,可以直接dfs枚举所有路径,直到找到符合条件的路径输出
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 110
int n,cnt;
int a[N],b[N];
int x[]={1,-1,0,0},y[]={0,0,1,-1};
bool f=false,vis[N][N];
// 记录路径
vector<int> path;
void dfs(int u,int v,int st){
// 提前返回
if(f||st>cnt)return;
if(st==cnt&&(u-1)*n+v-1==n*n-1){
for(auto it:path)cout<<it<<" ";cout<<endl;
f=true;
return;
}
for(int i=0;i<4;i++){
int xx=u+x[i];
int yy=v+y[i];
if(xx<1||yy<1||xx>n||yy>n)continue;
if(vis[xx][yy])continue;
if(a[yy]==0)continue;
if(b[xx]==0)continue;
a[yy]--,b[xx]--;
vis[xx][yy]=true;
path.push_back((xx-1)*n+yy-1);
// 搜索下一个
dfs(xx,yy,st+2);
a[yy]++,b[xx]++;
vis[xx][yy]=false;
path.pop_back();
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
// 记录一共射了多少箭
for(int i=1;i<=n;i++)cnt+=a[i]+b[i];
// 初始化起始位置
a[1]--;b[1]--;
vis[1][1]=true;
path.push_back(0);
dfs(1,1,2);
return 0;
}