python数独伪代码回溯法_数独代码(回溯算法。力扣37题)

1 #include

2 #include

3 #include

4 #include

5 using namespacestd;6

7 const int MaxLen = 9;8 //以下三个数组用于判断是否有重复,避免循环查找重复元素

9 char ArrRow[MaxLen][MaxLen] = {0}; //用于快速判断行内有没有重复元素

10 char ArrCol[MaxLen][MaxLen] = {0}; //用于快速判断列内有没有重复元素

11 char ArrGlb[MaxLen][MaxLen] = {0}; //用于快速判断每9个格子里有没有重复元素

12

13 void SetMark(int nX,int nY, int nIdx, int nCheck, intnSet)14 {15 ArrRow[nX][nCheck] =nSet;16 ArrCol[nY][nCheck] =nSet;17 ArrGlb[nIdx][nCheck] =nSet;18 }19

20 bool TrySet(vector>& board, int nNextX, int nNextY)//xy为考察到哪个坐标了

21 {22 while (board[nNextX][nNextY] != '.')//考察下个坐标

23 {24 if (nNextY < MaxLen-1)25 {26 ++nNextY;27 }28 else if (nNextX < MaxLen-1)29 {30 ++nNextX;31 nNextY=0;32 }33 else

34 {35 return true;36 }37 }38 bool bHave = false;39 int nIndex = (nNextX / 3) * 3 + nNextY / 3;40 for (int szDian = 0; szDian < 9; ++szDian)41 {42 if(ArrRow[nNextX][szDian] == 1 || ArrCol[nNextY][szDian] == 1 || ArrGlb[nIndex][szDian] == 1)43 continue;44

45 bHave = true;46 board[nNextX][nNextY] = '1' +szDian;47

48 SetMark(nNextX, nNextY, nIndex, szDian, 1);49 if(!TrySet(board, nNextX, nNextY))50 {51 board[nNextX][nNextY] = '.';52 bHave = false;53 SetMark(nNextX, nNextY, nIndex, szDian, 0);54 }55 }56 if (!bHave)57 {58 return false;59 }60 return true;61 }62 void solveSudoku(vector>&board)63 {64 //把vector元素映射到检查辅助数组

65 int nTemp = 0;66 int nIndex = 0;67 int nIndexX = 0;68 for (int i = 0; i

82 TrySet(board, 0, 0);83 }84 //------------------------------85 //----------以下是测试代码-------86 //------------------------------

87 void Print(vector>&board)88 {89 for (int i = MaxLen-1; i>=0 ;--i)90 {91 for (int j = 0; j>board;103 char arrp1[9] = {'.','.','.','2','7','5','9','.','.'};104 char arrp2[9] = {'.','.','.','.','.','.','.','.','6'};105 char arrp3[9] = {'.','.','.','8','.','3','.','2','.'};106 char arrp4[9] = {'.','9','8','.','.','.','3','.','.'};107 char arrp5[9] = {'.','6','4','.','1','.','5','9','.'};108 char arrp6[9] = {'.','.','7','.','.','.','2','4','.'};109 char arrp7[9] = {'.','2','.','1','.','9','.','.','.'};110 char arrp8[9] = {'7','.','.','.','.','.','.','.','.'};111 char arrp9[9] = {'.','.','9','7','4','8','.','.','.'};112 /*char arrp1[9] = {'5','3','.','.','7','.','.','.','.'};113 char arrp2[9] = {'6','.','.','1','9','5','.','.','.'};114 char arrp3[9] = {'.','9','8','.','.','.','.','6','.'};115 char arrp4[9] = {'8','.','.','.','6','.','.','.','3'};116 char arrp5[9] = {'4','.','.','8','.','3','.','.','1'};117 char arrp6[9] = {'7','.','.','.','2','.','.','.','6'};118 char arrp7[9] = {'.','6','.','.','.','.','2','8','.'};119 char arrp8[9] = {'.','.','.','4','1','9','.','.','5'};120 char arrp9[9] = {'.','.','.','.','8','.','.','7','9'};*/

121 vector vectemp9(arrp9, arrp9 + 9);122 vector vectemp8(arrp8, arrp8 + 9);123 vector vectemp7(arrp7, arrp7 + 9);124 vector vectemp6(arrp6, arrp6 + 9);125 vector vectemp5(arrp5, arrp5 + 9);126 vector vectemp4(arrp4, arrp4 + 9);127 vector vectemp3(arrp3, arrp3 + 9);128 vector vectemp2(arrp2, arrp2 + 9);129 vector vectemp1(arrp1, arrp1 + 9);130 board.push_back(vectemp9);131 board.push_back(vectemp8);132 board.push_back(vectemp7);133 board.push_back(vectemp6);134 board.push_back(vectemp5);135 board.push_back(vectemp4);136 board.push_back(vectemp3);137 board.push_back(vectemp2);138 board.push_back(vectemp1);139 Print(board);140 solveSudoku(board);141 Print(board);142 return 0;143 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值