数独(C++)

 1

感受:这个题简直无情,recursive backtracking 终于对了。

reference http://see.stanford.edu/materials/icspacs106b/H19-RecBacktrackExamples.pdf

1033.数独游戏

 

【输入格式】

  一个9×9的矩阵(数字之间没有空格)0代表初始时没有数字,1-9代表初始时的数字

【输出格式】

  一个 9×9 的矩阵,表示输入矩阵的解。(输入数据保证有且只有一个解)

【样例输入】
   

800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400


【样例输出】 
  

812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452


  【数据规模和约定】

  输入数据中每一个数字都是1~9之间的一个数字。

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4 
 5 struct Grid{
 6     int a[9][9];
 7     }; 
 8 
 9 bool FindUnassignedLocation(Grid &grid,int &i, int &j)
10 {
11     for (i = 0; i < 9; i++)
12     for (j = 0; j < 9; j++)
13         if (grid.a[i][j] == 0) return true;
14     return false;
15 }
16 
17 bool UsedInRow(Grid &grid,int row,int col, int num)
18 {
19     for (int j = 0; j < 9; j++)
20     if (grid.a[row][j] == num) return true;
21     return false;
22 }
23 
24 bool UsedInCol(Grid &grid,int row,int col, int num)
25 {
26     for (int i = 0; i < 9; i++)
27     if (grid.a[i][col] == num) return true;
28     return false;
29 }
30 
31 bool UsedInSubGrid(Grid &grid,int row,int col, int num)
32 {
33     for (int i = row; i < row + 3; i++)
34     for (int j = col; j < col + 3; j++)
35     if (grid.a[i][j] == num) return true;
36     return false;
37 }
38 
39 bool NoConflicts(Grid &grid,int row,int col, int num)
40 {
41     return !UsedInRow(grid,row,col,num) && !UsedInCol(grid,row,col,num) 
42     && !UsedInSubGrid(grid,row - row % 3, col - col % 3, num);
43 }
44 
45 bool SolveSudoku(Grid &grid)
46 {
47     int row, col;
48     if (!FindUnassignedLocation(grid,row,col)) return true; // BASE CASE
49     
50     for (int num = 1; num <= 9; num++)
51     {
52         if (NoConflicts(grid,row,col,num))
53         {
54             grid.a[row][col] = num;
55             if (SolveSudoku(grid)) return true;
56             else
57             grid.a[row][col] = 0;
58         }
59     }
60     return false;
61 }
62 
63 void output(Grid& grid)
64 {
65     for (int i = 0; i < 9; i++)
66     for (int j = 0; j < 9; j++)
67     {
68         cout << grid.a[i][j];
69         if (j == 8) cout << endl;
70     }
71 }
72 
73 int main()
74 {
75    //ifstream cin("input.txt");
76    Grid grid; //a[9][9]
77     for (int i = 0; i < 9; i++)
78     for (int j = 0; j < 9; j++)
79     {
80         char digit;
81         cin >> digit;
82         grid.a[i][j] = digit - '0';
83     }
84 
85     bool status = SolveSudoku(grid);
86     output(grid);
87    return 0;
88 }

 

转载于:https://www.cnblogs.com/baizhima/p/3466719.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值