#include<bits/stdc++.h>
using namespace std;
#define ll long long
int xi[25];///西边的靶子上的箭数
int bei[25];///北边的靶子上的箭数
int vis[25][25];///标记是否走过
int n;
int ans[405];///存储路径
int dir[4][2]= {1,0,-1,0,0,1,0,-1};
int flag=0;
int cnt=0;
bool check() ///检查是否靶子上的箭是否用完
{
for(int i=0; i<n; i++)
{
if(xi[i]!=0) return 0;
}
for(int i=0; i<n; i++)
{
if(bei[i]!=0) return 0;
}
return 1;
}
void dfs(int x,int y)
{
if(x==n-1&&y==n-1) ///递归出口
{
if(check())
{
flag=1;
for(int i=0; i<cnt; i++)
{
printf("%d",ans[i]);
if(i!=cnt-1) printf(" ");
}
printf("\n");
}
return ;
}
for(int i=0; i<4; i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx<0||yy<0||xx>=n||yy>=n)
{
continue;
}
if(vis[xx][yy]==0&&xi[xx]>0&&bei[yy]>0)
{
vis[xx][yy]=1;
xi[xx]--;
bei[yy]--;
ans[cnt]=xx*n+yy;
cnt++;
dfs(xx,yy);
if(flag==1) return ;
vis[xx][yy]=0;
xi[xx]++;
bei[yy]++;
cnt--;
}
}
}
int main()
{
ios::sync_with_stdio(false);
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&bei[i]);
}
for(int i=0; i<n; i++)
{
scanf("%d",&xi[i]);
}
memset(vis,0,sizeof(vis));
vis[0][0]=1;
ans[0]=0;
cnt++;
xi[0]--;
bei[0]--;
dfs(0,0);
return 0;
}
1303: [蓝桥杯2016决赛]路径之谜(dfs+全排列)
最新推荐文章于 2022-04-01 18:42:08 发布