package main import ( "bufio" "fmt" "log" "os" "strconv" "strings" ) var comps []Component var strongest, best Bridge func main() { inp := StdinToStrings() for i := range inp { comps = append(comps, NewComponent(inp[i])) } FindStrongest([]Component{NewComponent("0/0")}) fmt.Println("Strongest:\n", strongest) FindBest([]Component{NewComponent("0/0")}) fmt.Println("Best:\n", best) } // Strongest, regardless of length func FindStrongest(bridge Bridge) { if bridge.Strength() > strongest.Strength() { strongest = bridge } for i := range comps { if comps[i].Has(bridge.Needs()) && !bridge.Has(comps[i]) { FindStrongest(append(bridge, comps[i])) } } } // Longest and Strongest func FindBest(bridge Bridge) { if bridge.Length() > best.Length() { best = append([]Component{}, bridge...) } else if bridge.Length() == best.Length() { if bridge.Strength() > best.Strength() { best = bridge } } for i := range comps { if comps[i].Has(bridge.Needs()) && !bridge.Has(comps[i]) { FindBest(append(bridge, comps[i])) } } } type Bridge []Component func (b Bridge) Strength() int { var ret int for _, v := range []Component(b) { ret += v.Strength() } return ret } func (b Bridge) Has(c Component) bool { for _, v := range []Component(b) { if v.Name == c.Name { return true } } return false } func (b Bridge) Add(c Component) Bridge { b = Bridge(append([]Component(b), c)) return b } func (b Bridge) Needs() int { t := []Component(b) c := t[len(t)-1] if len(t) == 1 { return c.Other(0) } c1 := t[len(t)-2] // Find the side of c that doesn't connect with c1 if c.Has(c1.Side1) { return c.Other(c1.Side1) } return c.Other(c1.Side2) } func (b Bridge) Length() int { return len([]Component(b)) } func (b Bridge) String() string { ret := "[ " for _, v := range []Component(b) { ret += v.Name + " " } return fmt.Sprint(ret+"(", b.Strength(), ";", b.Length(), ") ]") } type Component struct { Name string Side1, Side2 int } func NewComponent(in string) Component { c := Component{} c.Name = in pts := strings.Split(in, "/") c.Side1 = Atoi(pts[0]) c.Side2 = Atoi(pts[1]) return c } func (c *Component) Equals(t Component) bool { return c.Side1 == t.Side1 && c.Side2 == t.Side2 } func (c *Component) Strength() int { return c.Side1 + c.Side2 } func (c *Component) Has(v int) bool { return c.Side1 == v || c.Side2 == v } func (c *Component) Other(v int) int { if c.Side1 == v { return c.Side2 } return c.Side1 } func (c *Component) String() string { return c.Name } func Atoi(i string) int { var ret int var err error if ret, err = strconv.Atoi(i); err != nil { log.Fatal("Invalid Atoi") } return ret } func StdinToStrings() []string { var input []string scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { input = append(input, scanner.Text()) } return input }