// primer 6

package main

 

import "fmt"

 

type šahovskaTabla [8]int

 

func (t šahovskaTabla) Print() {

    var redovi [8][8]string

    var prazanRed = [8]string{".", ".", ".", ".", ".", ".", ".", "."}

 

    // inicijalizacija redova

    for red := 0; red < 8; red++ {

        redovi[red] = prazanRed

    }

 

    for i := 0; i < 8; i++ {

        redovi[t[i]][i] = ""

    }

 

    for i := 7; i >= 0; i-- {

        fmt.Printf("%d %v\n", i+1, redovi[i])

    }

    fmt.Printf(" a b c d e f g h \n %v\n", t)

}

 

func (t šahovskaTabla) Horizontalno() bool {

    var b [8]bool

    for _, r := range t {

        if b[r] {

            return false

        }

        b[r] = true

    }

    return true

}

 

func (t šahovskaTabla) Dijagonalno() bool {

    for i := 1; i < 8; i++ {

        // Provera kolone i prema kolonama levo od i

        for j := i - 1; j >= 0; j-- {

            // Provera kolona i,j

            N := t[i]

            X := t[j]

 

            // Provera prve dijagonale

            if N-(i-j) >= 0 && X == N-(i-j) {

                return false

            }

 

            // Provera druge dijagonale

            if N+(i-j) < 8 && X == N+(i-j) {

                return false

            }

        }

    }

    return true

}

 

func (t šahovskaTabla) SledećiRaspored() bool {

    for i := 7; i >= 0; i-- {

        if tabla[i] < 7 {

            tabla[i]++

            return true

        }

        // Ovde je tabla[i] == 7,

        // postavljamo tabla[i] = 0

        // i povećavamo kolonu levo za 1 u sledećem prolasku kroz petlju

        tabla[i] = 0

    }

    return false

}

 

var tabla šahovskaTabla

 

func main() {

    brojPokušaja, brojHorizontalnih, brojRešenja := 0, 0, 0

 

    dalje := true

    for dalje {

        brojPokušaja++

        if tabla.Horizontalno() {

            brojHorizontalnih++

            if tabla.Dijagonalno() {

                brojRešenja++

                tabla.Print()

            }

        }

        dalje = tabla.SledećiRaspored()

    }

    fmt.Printf("Broj pokušaja: %d, H.OK: %d, broj rešenja: %d\n", brojPokušaja, brojHorizontalnih, brojRešenja)

}