2019 PD2 Project 1
sudoku
If you don't know what is "sudoku"...
- fill rows with 1-9
- fill columns with 1-9
- fill sub-grids with 1-9
Your mission
- Write code to solve sudoku problem
- Write code to generate sudoku problem
- Learn to use Makefile && follow coding style
How to solve
I don't know ¯\_(ツ)_/¯
How to generate
- fill number randomly
- remove some number from solved problem
- transform an existing problem
Transforming
• Rotate the grid 90, 180, or 270 degrees.
• Flip the board horizontally or vertically
• Permute the rows 1-3, 4-6, or 7-9.
• Permute the columns 1-3, 4-6, or 7-9.
• Permute the 3x9 blocks of rows.
• Permute the 9x3 blocks of columns.
• Permute the digits.
Scoring
- Build with Makefile (5%)
- Generate problem (10%)
- Can transform (10%)
- Solve Correctness (40%)
- Solve Speed (20%)
- Finished normally (10%)
- Coding style (5%)
Build with Makefile (5%)
- Use Makefile to generate 3 executable files
-
solve / transform / generate
-
- You may need to add some cpp files by yourself.
-
To prevent rewriting code, you can write your sudoku code in sudoku.h / sudoku.cpp
- Each file has its own input/output rules
Sudoku board format
3 0 2 0 0 5 6 9 0
0 4 0 0 9 6 0 3 0
0 5 0 0 0 8 0 0 0
1 9 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 1
0 0 0 8 0 0 0 2 0
0 8 0 9 6 0 0 7 0
0 6 5 7 0 0 3 0 9
-
digit is split with single space (' ')
-
each line end with newline ('\n')
- no trailing space !
- read from stdin (cin/scanf/...)
- print to stdout (cout/printf/...)
Generate problem (10%)
- Generate a solvable sudoku problem and print it out
$ ./generate
3 0 2 0 0 5 6 9 0
0 4 0 0 9 6 0 3 0
0 5 0 0 0 8 0 0 0
1 9 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 1
0 0 0 8 0 0 0 2 0
0 8 0 9 6 0 0 7 0
0 6 5 7 0 0 3 0 9
Can transform (10%)
- Read problem, transform by instruction, print it out
- instruction format:
-
0 (finish, print it out)
-
1 x y (changeNum, {x,y = 1~9})
-
2 x y (changeRow, {x,y = 0,1,2})
-
3 x y (changeCol, {x,y = 0,1,2})
-
4 x (clockwise rotate 90 degree x times)
-
5 x (0 is up-down flip, 1 is left-right flip)
-
Transform example (1)
3 0 2 0 0 5 6 9 0
0 4 0 0 9 6 0 3 0
0 5 0 0 0 8 0 0 0
1 9 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 1
0 0 0 8 0 0 0 2 0
0 8 0 9 6 0 0 7 0
0 6 5 7 0 0 3 0 9
1 1 9
0
3 0 2 0 0 5 6 1 0
0 4 0 0 1 6 0 3 0
0 5 0 0 0 8 0 0 0
9 1 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 9
0 0 0 8 0 0 0 2 0
0 8 0 1 6 0 0 7 0
0 6 5 7 0 0 3 0 1
Input Output
Transform example (2)
3 0 2 0 0 5 6 9 0
0 4 0 0 9 6 0 3 0
0 5 0 0 0 8 0 0 0
1 9 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 1
0 0 0 8 0 0 0 2 0
0 8 0 9 6 0 0 7 0
0 6 5 7 0 0 3 0 9
2 0 1
0
1 9 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 1
3 0 2 0 0 5 6 9 0
0 4 0 0 9 6 0 3 0
0 5 0 0 0 8 0 0 0
0 0 0 8 0 0 0 2 0
0 8 0 9 6 0 0 7 0
0 6 5 7 0 0 3 0 9
Input Output
Transform example (3)
3 0 2 0 0 5 6 9 0
0 4 0 0 9 6 0 3 0
0 5 0 0 0 8 0 0 0
1 9 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 1
0 0 0 8 0 0 0 2 0
0 8 0 9 6 0 0 7 0
0 6 5 7 0 0 3 0 9
3 1 2
0
3 0 2 6 9 0 0 0 5
0 4 0 0 3 0 0 9 6
0 5 0 0 0 0 0 0 8
1 9 0 7 0 3 0 8 0
0 0 0 0 0 0 0 0 0
5 0 7 0 6 1 0 3 0
0 0 0 0 2 0 8 0 0
0 8 0 0 7 0 9 6 0
0 6 5 3 0 9 7 0 0
Input Output
Transform example (4)
3 0 2 0 0 5 6 9 0
0 4 0 0 9 6 0 3 0
0 5 0 0 0 8 0 0 0
1 9 0 0 8 0 7 0 3
0 0 0 0 0 0 0 0 0
5 0 7 0 3 0 0 6 1
0 0 0 8 0 0 0 2 0
0 8 0 9 6 0 0 7 0
0 6 5 7 0 0 3 0 9
4 9
0
0 0 0 5 0 1 0 0 3
6 8 0 0 0 9 5 4 0
5 0 0 7 0 0 0 0 2
7 9 8 0 0 0 0 0 0
0 6 0 3 0 8 0 9 0
0 0 0 0 0 0 8 6 5
3 0 0 0 0 7 0 0 6
0 7 2 6 0 0 0 3 9
9 0 0 1 0 3 0 0 0
Input Output
Transform example (5)
0 0 0 5 0 1 0 0 3
6 8 0 0 0 9 5 4 0
5 0 0 7 0 0 0 0 2
7 9 8 0 0 0 0 0 0
0 6 0 3 0 8 0 9 0
0 0 0 0 0 0 8 6 5
3 0 0 0 0 7 0 0 6
0 7 2 6 0 0 0 3 9
9 0 0 1 0 3 0 0 0
5 1
0
3 0 0 1 0 5 0 0 0
0 4 5 9 0 0 0 8 6
2 0 0 0 0 7 0 0 5
0 0 0 0 0 0 8 9 7
0 9 0 8 0 3 0 6 0
5 6 8 0 0 0 0 0 0
6 0 0 7 0 0 0 0 3
9 3 0 0 0 6 2 7 0
0 0 0 3 0 1 0 0 9
Input Output
Transform example (6)
0 0 0 5 0 1 0 0 3
6 8 0 0 0 9 5 4 0
5 0 0 7 0 0 0 0 2
7 9 8 0 0 0 0 0 0
0 6 0 3 0 8 0 9 0
0 0 0 0 0 0 8 6 5
3 0 0 0 0 7 0 0 6
0 7 2 6 0 0 0 3 9
9 0 0 1 0 3 0 0 0
1 1 3
2 0 2
5 1
0
6 0 0 7 0 0 0 0 1
9 1 0 0 0 6 2 7 0
0 0 0 1 0 3 0 0 9
0 0 0 0 0 0 8 9 7
0 9 0 8 0 1 0 6 0
5 6 8 0 0 0 0 0 0
1 0 0 3 0 5 0 0 0
0 4 5 9 0 0 0 8 6
2 0 0 0 0 7 0 0 5
Input Output
Solve (60%)
- Input
- A sudoku problem
- Output
- Problem status
- 0 for no solution
- 1 for unique solution
- 2 for multiple solution
- solution (if is unique)
- Problem status
Example output
// Has unique solution
1
3 7 2 1 4 5 6 9 8
8 4 1 2 9 6 5 3 7
9 5 6 3 7 8 2 1 4
1 9 4 6 8 2 7 5 3
6 3 8 5 1 7 9 4 2
5 2 7 4 3 9 8 6 1
7 1 9 8 5 3 4 2 6
2 8 3 9 6 4 1 7 5
4 6 5 7 2 1 3 8 9
// No solution
0
// Has multiple solution
2
Solve judge detail
- Correctness
- >25% correct (20%)
- >50% correct (10%)
- 100% correct (10%)
- Speed
- avg <10s (10%)
- avg < 5s (5%)
- avg < 1s (5%)
Finished normally (10%)
- Your program should not crash during tests.
Coding style (5%)
- Your code should follow Google's C++ Style
- You can install astyle to format your code
- sudo apt install -y astyle
- astyle command:
-
astyle --style=google --indent=spaces=4 --suffix=none <file>
2019 PD2 Project
By Liang Yu-Cheng
2019 PD2 Project
- 3,026