sudokuusers-cs.au.dk/mic/dintprog/e13/uge/1/slides/00-sudoku.pdf · dintprog, e13 sudoku.2...

28
Sudoku 数 独 (tal en gang)

Upload: phamdien

Post on 30-Jun-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

Sudoku

数 独 (tal en gang)

dIntProg, E13 Sudoku.2

Oprindelsen af Sudoku

•  Suji wa dokushin ni kagir –  tallene må kun forekomme én gang

•  Su doku –  tal enkelt

•  Opfundet af Leonhard Euler –  Schweitzisk matematiker, 1707-1783 –  Største matematiker i det 18. århundrede –  Latinske kvadrater (romertal), 1783

Leonhard Euler Joseph Louis Lagrange Simeon Denis Poisson

Gustav Peter Lejeune Dirichlet Rudolf Otto Sigismund Lipschitz

C. Felix (Christian) Klein C. L. Ferdinand (Carl Louis) Lindemann

Hermann Minkowski Constantin Carathéodory

Georg Aumann Friedrich Ludwig Bauer

David Gries Michael E. Caspersen

dIntProg, E13 Sudoku.3

Nutidens Sudoku •  Howard Garnes, 1979

–  Math Puzzles and Logic Problems, Dell Magazines –  Amerikansk puslespilsblad –  Et spil benævnt ”Number Place”

•  Nikoli, 1984 –  Japansk puslespilsblad –  Introducerede betegnelsen Suji wa dokushin ni kagir –  Stort hit fra 1986 (registreret varemærke)

•  I dag –  Udgivelse af fem Sudoku-blade hver måned i Japan

dIntProg, E13 Sudoku.4

Sudoku og computerprogrammer •  Wayne Gould

–  Startede i 1997 på et program der kunne lave Sudoku-spil –  Det tog ham efter sigende over seks år... –  waynegouldpuzzles.com/sudoku/

•  Leverer til engelske aviser... –  Debut i The Times, 12. november 2004

•  ... og danske –  Politiken, 12. juni 2005 –  Jyllands-Posten, 13. juni 2005 –  Ekstra Bladet, 15. juni 2005 –  ...

dIntProg, E13 Sudoku.5

GADs bestsellerliste, 14. oktober 2005

1.  Litas: Sudoku 1 2.  Litas: Sudoku 2 3.  Litas: Sudoku 3 4.  Sudoku for begyndere 5.  Sudoku 6.  Su Doku 7.  Su Doku 2 8.  Flere Sudoku 9.  Junior Sudoku 10. Mange flere Sudoku

dIntProg, E13 Sudoku.6

Mennesket mod maskinen... (1)

Deep Blue vinder matchen 3,5 – 2,5

3. – 11. maj 1997

dIntProg, E13 Sudoku.7

Mennesket mod maskinen... (2)

Dyb Gul løfter 187,5 kg mod Kaspers 180 kg

11. maj 19...

Kasper Dyb Gul

dIntProg, E13 Sudoku.8

Computere og intelligens...

En computer der spiller skak

udviser menneskelige træk i samme grad

som en gaffeltruck der løfter gods...

dIntProg, E13 Sudoku.9

Computerens styrke •  At kunne foretage simple beregninger lynhurtigt

•  På kort tid at kunne –  lagre store datamængder –  søge i store datamængder –  bearbejde store datamængder –  afsøge et stort antal muligheder og kombinationer

•  Informations-Repræsentations-Transformations-Maskine –  hurtig og sikker i detaljen –  skal programmeres!

Computer og program •  En computer er en generel maskine, men uden

program(mer) er den intet værd!

•  Computer + X-program = X-maskine

dIntProg, E13 Sudoku.10

X = Windows, Linux, OS X, … skak, sudoku, tekst, musik, studieadministration, social interaktion, flykontrol, stråle- behandling, DNA-forskning, kommunikation, spil, læse, regne, undervise, motorstyring, bremsestyring, bolighandel, bilhandel, dagligvarehandel, billeddeling, videodeling, kvidre, søge, oversættelse, … Computer

Program

Program

Program

Program

Eksempel: En Sudoku-maskine

dIntProg, E13 Sudoku.11

Computer

C++

Java VM

Java

Sudoko-løser

Programmering…

dIntProg, E13 Sudoku.12

Programmering =

+

Problemløsning Kodning (i Java)

dIntProg, E13 Sudoku.13

Program der kan spille Sudoku

dIntProg, E13 Sudoku.14

Opbygning af Grid

Blok: 3 x 3 felter (block)

Gitter: 9 blokke (grid)

dIntProg, E13 Sudoku.15

Spilleregel

I hver blok, række og søjle skal tallene 1..9 forekomme præcis en gang.

Blok

Række

Søjle

Sudoku

dIntProg, E13 Sudoku.16

Strategier ?

dIntProg, E13 Sudoku.17

Strategier med udgangspunkt i værdi

•  Eliminering (Locked cells) –  udgangspunkt i en bestemt værdi

(værdien 1)

•  Afledt udelukkelse –  udgangspunkt i en bestemt værdi

(værdien 2)

dIntProg, E13 Sudoku.18

Strategier med udgangspunkt i felt

•  Komplettering –  udgangspunkt i et bestemt felt

•  Sweeping –  udgangspunkt i et bestemt felt

dIntProg, E13 Sudoku.19

Hvis man har muskler nok •  Rå kraft (brute force)

•  Afprøv systematisk alle lovende muligheder a b c d e f g h i

1

2

3

4

5

6

7

8

9

a1 c1 e1 g1 i1 a2 b2 e2 h2 i2 ...

9

3 9

2 7 8

7 8

8

3 9 2 7 8 1 7

7

9 2

9

2 4

1 4

dIntProg, E13 Sudoku.20

Hvis man har muller nok •  Rå kraft (brute force)

•  Afprøv systematisk alle lovende muligheder a b c d e f g h i

1

2

3

4

5

6

7

8

9

a1 c1 e1 g1 i1 a2 b2 e2 h2 i1 ...

9

3 9

2 7 8

7 8

8

3 9 2 7 8 1 7

7

9 4

9

2 4

1 4

dIntProg, E13 Sudoku.21

Hvis man har muller nok •  Rå kraft (brute force)

•  Afprøv systematisk alle lovende muligheder a b c d e f g h i

1

2

3

4

5

6

7

8

9

a1 c1 e1 g1 i1 a2 b2 e2 h2 i1 ...

9

3 9

2 7 8

7 8

8

3 9 2 7 8 4

7

9

2 4

1 4

?

dIntProg, E13 Sudoku.22

Algoritmen prøvAlleMuligheder() { if <alle felter er udfyldt> { <udskriv grid> } else { <husk seneste felt> <gå til næste frie felt> for <hvert ciffer c> { if <c er lovende> { <fastfrys feltværdi> prøvAlleMuligheder() } } // backtrack to previous field <fortryd fastfrosne værdi> <gå tilbage til forrige felt> } }

a b c d e f g h i

1

2

3

4

5

6

7

8

9

3 9 2 7 8 1 7 9 4

dIntProg, E13 Sudoku.23

Hvad har vi brug for at kunne på et Grid prøvAlleMuligheder() { if <alle felter er udfyldt> { <udskriv grid> } else { <husk seneste felt> <gå til næste frie felt> for <hvert ciffer c> { if <c er lovende> { <fastfrys feltværdi> prøvAlleMuligheder() } } // backtrack to previous field <fortryd fastfrosne værdi> <gå tilbage til forrige felt> } }

// allFilled() // printGrid() // currentField() // advanceToNextUnfilled() // promissing(c) // setFieldValue(c) // clearCurrentField() // setToField()

dIntProg, E13 Sudoku.24

Java-version public void tryAll() { if ( g.allFilled() ) { g.printGrid(); } else { // try all promissing values at next field Field previous = g.currentField(); g.advanceToNextUnfilled(); for ( int c = 1; c <=9; c++ ) { if ( g.promissing(c) ) { g.setFieldValue(c); tryAll(); } } // backtrack to previous field g.clearCurrentField(); g.setToField(previous); } }

Metoden promissing(c) benytter sweeping til at afgøre om en kandidat c er værd at satse på.

blok række søjle

dIntProg, E13 Sudoku.25

Klassemodel

Grid

boolean allFilled() void printGrid() Field currentField() void advanceToNextField() boolean promissing(int c) void setFieldValue(int v) void clearCurrentField() void setToField(Field f)

Solver

void tryAll()

1

En Sudoku-maskine

dIntProg, E13 Sudoku.26

Computer

C++

Java VM

Java

Sudoko-løser

En Sudoku-maskine

dIntProg, E13 Sudoku.27

Computer

C++

Java VM

Java

Sudoko-løser: Grid

Solver

Time Magazine, 1984

dIntProg, E13 Sudoku.28

In 1984, TIME magazine quoted the chief editor of a certain software publication as saying:

"Put the right kind of software into a computer, and it will do whatever you want it to. There may be limits on what you can do with the machines themselves, but there are no limits on what you can do with

software.”

Sludder!

Der er grænser – masser af grænser –

men ufatteligt mange ting kan lade sig gøre.