0
点赞
收藏
分享

微信扫一扫

蓝桥训练营-路径之谜-java(深搜)

清冷的蓝天天 2022-01-11 阅读 50

题目

思路:深度优先搜索,记录每次深搜的横纵坐标再对对应方向的靶子数组进行计数操作,最后满足到达终点,且对靶子数的叠加刚好都对应即可输出路径

Code:

import java.util.Scanner;
import java.util.*;


public class Main{

    static  int[][] dir={{0,1},{1,0},{0,-1},{-1,0}};
    static int[] west;
    static int[] north;
    static int[] visit;
    static int n;
    static ArrayList<Integer> list=new ArrayList<>();
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        visit=new int[n*n];
        north=new int[n];
        west=new int[n];
        for (int i = 0; i <n; i++) {
            north[i]= scanner.nextInt();
        }
        for (int i = 0; i <n; i++) {
            west[i]= scanner.nextInt();
        }
        list.add(0);
        north[0]--;
        west[0]--;
        visit[0]=1;
        dfs(0,0,0);
    }

    private static void dfs(int x, int y, int num) {

        if (x*n+y==n*n-1){
            for (int i = 0; i < n; i++) {
                if (north[i]!=0||west[i]!=0){
                    return;
                }
            }
            for (int i = 0; i <=num; i++) {
                System.out.print(list.get(i)+" ");
            }
            return;
        }
        for (int i = 0; i < dir.length; i++) {
            int x1=x+dir[i][0];
            int y1=y+dir[i][1];
            if (x1>=0&&x1<n&&y1>=0&&y1<n&&visit[x1*n+y1]!=1&&west[x1]>0&&north[y1]>0){
                visit[x1*n+y1]=1;
                north[y1]--;
                west[x1]--;
                list.add(x1*n+y1);
                dfs(x1,y1,num+1);
                list.remove(list.size()-1);
                north[y1]++;
                west[x1]++;
                visit[x1*n+y1]=0;
            }
        }
    }
}




举报

相关推荐

0 条评论