// 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)
}