理解:本来想的是dfs遍历路径,但是没做出来,参考了答案,以下是代码
理解:首先dfs老套路,使用标记数组判断是否标记过,根据题意有四种走法,使用二维数组保存,当没有走到终点的时候,使用一个循环遍历四种走法,分别进行dfs,题目要求打印路径,使用一个n方大小的一维数组保存路径,保存当前结点在一维数组中的下标
```java
import java.util.*;
public class File01 {
//路径之迷
private static int[][] vis;
private static int[] x;
private static int[] y;
private static int n;
private static int[][] path = {{0,1},{0,-1},{1,0},{-1,0}};//四种路径
private static int[] res;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
x = new int[n];
y = new int[n];
res = new int[n*n];
vis = new int[n][n];
for(int i=0;i<n;i++) {
y[i] = in.nextInt();
}
for(int i=0;i<n;i++) {
x[i] = in.nextInt();
}
dfs(0,0,0);
}
private static void dfs(int i,int j,int step) {//step表示当前走的步数
vis[i][j] = 1;
res[step] = i*n+j;//保存该结点位置——路径
x[i]--;
y[j]--;
if(i==n-1&&j==n-1&&isPath()) {//到最后一个结点并且满足条件
for(int k=0;k<=step;k++) {//打印路径
System.out.print(res[k]+" ");
}
System.out.println();
return;
}
for(int k=0;k<4;k++) {//四种可能性
int xx = i+path[k][0];
int yy = j+path[k][1];
if(xx>=0&&xx<n&&yy>=0&&yy<n&&vis[xx][yy]==0) {
if(y[yy]>0&&x[xx]>0) {//此时还未减完
// vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]=0;
}
}
}
x[i]++;//回溯
y[j]++;
}
private static boolean isPath() {//x方向和y方向的箭数均减为0
for(int i=0;i<n;i++) {
if(x[i]!=0||y[i]!=0) {
return false;
}
}
return true;
}
}