package main

import "fmt"

func getIdx(target int, nodes []int) int {
	for i := 0; i < len(nodes); i++ {
		if nodes[i] == target {
			return i
		}
	}
	return -1
}

func notExist(target int, slice []int) bool {
	for i := 0; i < len(slice); i++ {
		if slice[i] == target {
			return false
		}
	}
	return true
}

func dfs(start, end int, nodes []int, edges [][]bool) ([]int, bool) {
	var route []int
	var stack []int
	startIdx := getIdx(start, nodes)
	stack = append(stack, startIdx)
	for len(stack) > 0 {
		now := stack[len(stack)-1]
		route = append(route, nodes[now])
		if len(stack) > 1 {
			stack = stack[:len(stack)-1]
		} else {
			stack = stack[:len(stack)-1]
		}
		for i := 0; i < len(edges[now]); i++ {
			if edges[now][i] && notExist(i, stack) {
				stack = append(stack, i)
			}
			edges[now][i] = false
			edges[i][now] = false
		}
		if route[len(route)-1] == end {
			return route, true
		}
	}
	return nil, false
}

func main() {
	nodes := []int{
		1, 2, 3, 4, 5, 6,
	}
	/*
		sample graph
		①-②
		|  |
		③-④-⑤-⑥
	*/
	edges := [][]bool{
		{false, true, true, false, false, false},
		{true, false, false, true, false, false},
		{true, false, false, true, false, false},
		{false, true, true, false, true, false},
		{false, false, false, true, false, true},
		{false, false, false, false, true, false},
	}
	start := 1
	end := 6
	route, _ := dfs(start, end, nodes, edges)
	fmt.Println(route)
}