set logo \
{R0lGODlhRABkAPf/AP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+Z
zP+Zmf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8A
zP8Amf8AZv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZ
zMyZmcyZZsyZM8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wA
zMwAmcwAZswAM8wAAJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZ
zJmZmZmZZpmZM5mZAJlm/5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kA
zJkAmZkAZpkAM5kAAGb//2b/zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZ
zGaZmWaZZmaZM2aZAGZm/2ZmzGZmmWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YA
zGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZ
zDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNmMzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMA
zDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZ
zACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz/wAzzAAzmQAzZgAzMwAzAAAA/wAA
zAAAmQAAZgAAM+4AAN0AALsAAKoAAIgAAHcAAFUAAEQAACIAABEAAADuAADdAAC7AACqAACI
AAB3AABVAABEAAAiAAARAAAA7gAA3QAAuwAAqgAAiAAAdwAAVQAARAAAIgAAEe7u7t3d3bu7
u6qqqoiIiHd3d1VVVURERCIiIhEREQAAACwAAAAARABkAAAI/wABCBxIsKDBgwgTKlzIsKHA
evYOSHRAUYaMGTky5nDgsOPAevUkHkBA0YFFjBl1AFm5MojLlzBjAplxwGNCByxbxtzJs6fP
IBvrMQQZcWJNADJ+Kl2qFMjGixpzqMwZU4ZAB0yzat26kyMArFzDivWJ4OrYs2iDHAWbtq3W
owfcyl0KRCiAuG2PHJnrE8hAvFr37tyxg29PvwIBMz2yY8EOwUciFCjw2HBMHQPtcV2w4CXj
yREKW4aZ4yOQrJ8r7+X8WPBol6Ufnl4cobPLyAWCuH7tcgbB2UsjR3BdoMbunXr1trU6EPjS
0HuP1LDdc+9GnMfDehXoXCl0lwuMV/8HchSAPSDZt24H0N2n9Ns7cqc/osMegHpPqtRzkP4t
QR2oiRYEZ9XpIFQVyDijoBXtbVUeADlwtRdl2R1RVz2kKKghMl2gZd9AEW71mW4xWXiAPQlq
qCEZZ9VFUIiB1cbTEQiokKKKzpCBTYsFwaiVY8cd8QCGODqDzCE7wpRciT1h9mJYQCpZWoZF
rsLTDqHBF+VOsQ00g4gD8nRAHkUqyOJONRRA3YBrklZQUoE1VmIO9pTpDJLIBaGmZzLy1KVA
cAYYwU4IkFmkKrMpd5uew91WQ6M7MTcQW4th6ZqFKJapYxBOwZiaazWQ2FVBlAZH2KUPGIrj
IZzKYJcO0cX/p9V6X4l4KkwOUInjKqog42seEEZXW387PVgrWkCscKOdzgQCwAyCbbmUsQig
RV8VzKrYRbCrbfXhX9bmoGq2peWg16PEymQXuGcdkYOuzK7CEXpBDJouTIgRpFhY7sJr5yES
kQgpU/myO5a7y9o5Rj0y6HVrVk4SdF67OSRcZg710CtgVn/KhuyyyPi7Ckn3+tQxd8jiSErC
+hxAr1iS/paWKhoekk/CVjxQsk8xN5fWKitaAXKgY9GKsljYHaIhENiqqE+DW5VlEIBiSQTE
PgquIq6KVrZlrEBUh1WTPVQeMsO4uu3809cQjnWACisriIgDnazIQUbIrvtk1U+o/0jGPbqu
AkhEyCLkY9SqrpKsv/fwx+NBh2tVqIaKZ6qiPRWozVPB/4l1hAOJ17UsKfXA+vjUnjtghYb7
1LcsIBnnfRDUSgm5upGI0LmsFQHQTrDePvObgwwKIpO7jSpasa9Y38rMrw7EG0lGBSrgKMPy
Ys8+FhAyAI0MGTk4gaMO2HP1dexiAeEA0Dk+ID7lQCDgO1Pnz//TA4GYOcP7WavfltGaOVgF
9KE//t3pAY5Di9HKtxgL5EN6+1PRGOSnuZ4sEFkP/F74VJSDl6GlZ3dJSw7kRifKwcZ+SgEh
AxejgwTlznLTswf6zuKbgqyQYBk6RA6QZyUg4COAaDlZqf8kFIRVHAljCVoF0EhxQ6YI8WAZ
OcIhkKG4eoxuiGF5oucwcwBAOKOKy6pCAs+iRbflIUVAIJuKVmCutERsUhRTFRkOoCsmorAp
BiEazKiEiMkpKB86awvnkGItINwjQYcAnYZkcEc8FuRLhcQHFR3QNEBkzi2DhGQh80GKHPTN
GR2Si4v2lpYjkGEfOVBW1+bSvLbNJY2HONNcjBW5reiAIjBx2b2A8AAEtHFaPUKO5soCHF8G
6Tjl2hktd+IU1DgAfZ+DVkykIqVgMUVqAwnbbebFpO58DpozGKOFvnKpcnFKJxYsiDZN9JWX
ucsBGwHONxO1kZg84C6eKlf8HlD/y5fQqj3cvI1fIoQUyDwTOPG7zLFuU64caNIn/yxRQHVj
ldN00DMHhYn8POMXcZbmABm7V8+8OS+DskdR25zh5345To9+JYTpGqlEAVBNWDUzpUqagTR1
09FyQqg0WIRJDT2mJKvAE1c4mYHpgkC+enjqlvgKyQxmo7521gQnJiPIDEkTOR2oBF8swRdW
X+IU5+QkrFnNTHUqxFYuOQelnonrT/7UxO0Z5o115Y0t9aVXvhQsr30lGF8Di0mCBJWwXBnl
QhHrITgyNi3lOexjsxLZ7a1kKmdtpIMGokeyrkQjMqCIRGSYEKKIRCQlKclJUBIVr2Y2shkJ
rQNGCzybCtj2trjNrW4HEhAAOw==}

image create photo tcllogo -data $logo

proc makefield {n} {
  global out

  .c delete all
  set out(fsize) [expr $out(maxsize)/$n]
  set csize [expr $out(fsize)*$n]
  .c configure -width $csize -height $csize
  for {set i 0} {$i < $n} {incr i} {
    for {set j 0} {$j < $n} {incr j} {
      set fid [.c create rectangle [expr $out(fsize)*$i] [expr $out(fsize)*$j] \
        [expr $out(fsize)*($i+1)] [expr $out(fsize)*($j+1)] \
        -outline {}]
      if {($i+$j)%2} {
        .c itemconfigure $fid -fill black
      } else {
        .c itemconfigure $fid -fill white
      }
    }
  }
  set out(wait) 1
  after 500 {set out(wait) 0}
}

proc ausgabe {n rescnt} {
  global f out

  if {$out(wait)} {
    tkwait variable out(wait)
  }
  .c delete damen
  for {set i 1} {$i <= $n} {incr i} {
    .c create oval [expr ($i-1)*$out(fsize)+1] [expr ($f($i)-1)*$out(fsize)+1] \
      [expr $i*$out(fsize)-1] [expr $f($i)*$out(fsize)-1] \
        -fill red -outline {} -tag damen
  }
  set out(cnt) $rescnt
  update
  set out(wait) 1
  after 500 {set out(wait) 0}
}

proc schlagtest {x} {
  global f
  
  for {set i 1} {$i < $x} {incr i} {
    if {$f($x) == $f($i) || abs($f($x)-$f($i)) == $x-$i} {
      return 0
    }
  }
  return 1
}

proc damen {n} {
  global f

  set x 1
  set f(1) 1
  set rescnt 0
  while {1} {
    while {$f($x) > $n} {
      if {$x == 1} {
        return $rescnt
      }
      incr x -1
      incr f($x)
    }
    if {[schlagtest $x]} {
      if {$x == $n} {
        incr rescnt
        ausgabe $n $rescnt
        incr x -1
        incr f($x)
      } else {
        incr x
        set f($x) 1
      }
    } else {
      incr f($x)
    }
  }
}

set out(maxsize) 300
frame .f -width 600 -height 310
label .logo -image tcllogo
label .lcnt -textvariable out(cnt) -font {Helvetica 24 bold}
canvas .c -width 300 -height 300
text .t -width 20
grid .logo -row 0 -column 0 -in .f -sticky n
grid .lcnt -row 1 -column 0 -in .f -sticky s
grid .c -row 0 -column 1 -rowspan 2 -in .f
grid .t -row 0 -column 2 -rowspan 2 -in .f -sticky nsew
pack .f
.t insert end "n-Damen-Problem\n"
.t insert end "===============\n"
set n 2
while 1 {
  makefield $n
  .t insert end "$n: "
  update
  .t insert end "[damen $n] Lsg.\n"
  .t yview end
  if {$out(wait)} {
    tkwait variable out(wait)
  }
  incr n
}
