import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    private static int countPaths(List<Integer> shops, List<List<Integer>> roads) {
        //Build map
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
        for (int i = 0; i < shops.size(); i++)
            map.put(i, new ArrayList<>());
        for (List<Integer> road : roads) {
            map.get(road.get(0)).add(road.get(1));
            System.err.println("Ajout a la cle " + road.get(0) + " de la valeur " + road.get(1));
            map.get(road.get(1)).add(road.get(0));
            System.err.println("Ajout a la cle " + road.get(1) + " de la valeur " + road.get(0));
        }

        //Read map
        for (Map.Entry<Integer, ArrayList<Integer>> entry : map.entrySet()) {
            System.err.println("clé : " + entry.getKey() + ", list: " + entry.getValue());
        }

        //Calcul des chemins valides
        int cpt = 0;
        for (int i = 0; i < shops.size(); i++) {
            cpt += dfs(map, shops, i, new boolean[shops.size()], new HashSet<>(), new ArrayList<>());
        }
        return cpt;
    }

    private static int dfs(Map<Integer, ArrayList<Integer>> map, List<Integer> shops, int current, boolean[] visited, Set<Integer> shopTypes, List<Integer> path) {
        if (shopTypes.contains(shops.get(current)))
            return 0;

        shopTypes.add(shops.get(current));
        path.add(current);
        visited[current] = true;
        System.err.println("Path : " + path);

        int validPaths = 0;
        if (shopTypes.size() == 4) {
            validPaths = 1;
            System.err.println("VALID Path : " + path);
        }
        else {
            for (int i : map.get(current)) {
                if (!visited[i])
                    validPaths += dfs(map, shops, i, visited, shopTypes, path);
            }
        }

        visited[current] = false;
        shopTypes.remove(shops.get(current));
        path.remove(path.size() - 1);
        return validPaths;
    }

    public static void main(String[] args) {
        List<Integer> shops = Arrays.asList(1, 0, 3, 2, 2);
        List<List<Integer>> roads = Arrays.asList(
                Arrays.asList(0, 1),
                Arrays.asList(1, 2),
                Arrays.asList(1, 4),
                Arrays.asList(2, 3),
                Arrays.asList(2, 4));
        System.out.println(countPaths(shops, roads));
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: