平时喜欢玩数独游戏,昨日突发想用程序自动求解。思路是回溯法,不断试探。
程序代码如下:
1 #include<stdio.h> 2 3 /* 4 {0,0,4,6,0,2,0,9,1}, 5 {2,1,0,9,8,4,0,5,6}, 6 {9,0,0,0,7,1,4,2,0}, 7 {1,2,5,0,6,0,3,4,7}, 8 {4,7,6,0,0,0,9,8,5}, 9 {8,3,9,0,4,0,1,6,2}, 10 {0,9,1,2,5,0,0,0,4}, 11 {5,8,0,4,1,6,0,3,9}, 12 {6,4,0,3,0,7,5,0,0}}; 13 */ 14 15 int data[9][9] = { 16 {0,7,0,2,6,0,9,0,0}, 17 {3,0,0,0,0,8,0,0,7}, 18 {0,9,0,0,5,7,0,0,0}, 19 {5,0,0,0,0,0,0,7,0}, 20 {0,4,7,3,1,2,8,5,0}, 21 {0,8,0,0,0,0,0,0,1}, 22 {0,0,0,8,2,0,0,4,0}, 23 {7,0,0,6,0,0,0,0,2}, 24 {0,0,4,0,3,9,0,8,0}}; 25 26 void input() 27 { 28 int i,j; 29 for(i = 0;i < 9;i++) 30 for(j = 0;j < 9;j++) 31 scanf("%d",&data[i][j]); 32 } 33 34 void output() 35 { 36 int i,j; 37 for(i = 0;i < 9;i++) 38 { 39 for(j = 0;j < 9;j++) 40 printf("%d ",data[i][j]); 41 printf("\n"); 42 } 43 printf("\n"); 44 } 45 46 /*检查num是否可放置在3*3区域是否有冲突*/ 47 int CheckSquare(int line,int col,int num) 48 { 49 int i = (line / 3) * 3; 50 int j = (col / 3) * 3; 51 int m,n; 52 for(m = i;m < i + 3;m++) 53 for(n = j;n < j + 3;n++) 54 if((data[m][n] == num) && !(m == line && n == col)) 55 return 0; 56 return 1; 57 } 58 59 /*检查行冲突*/ 60 int CheckLine(int line,int col,int num) 61 { 62 int i = 9; 63 while(i--) 64 if((data[line][i] == num) && (i != col)) 65 return 0; 66 return 1; 67 } 68 69 /*检查列冲突*/ 70 int CheckColumn(int line,int col,int num) 71 { 72 int i = 9; 73 while(i--) 74 if((data[i][col] == num) && (i != line)) 75 return 0; 76 return 1; 77 } 78 79 /*检查i行j列是否可放置num*/ 80 int Check(int i,int j,int num) 81 { 82 return CheckSquare(i,j,num) && CheckLine(i,j,num) && CheckColumn(i,j,num); 83 } 84 85 /*检查是否完成*/ 86 int IsDone() 87 { 88 int i,j; 89 for(i = 0;i < 9;i++) 90 for(j = 0;j < 9;j++) 91 if(!Check(i,j,data[i][j]) || (data[i][j] == 0)) 92 return 0; 93 return 1; 94 } 95 96 void Calc() 97 { 98 int i,j,x; 99 if(IsDone()) 100 { 101 output(); 102 return; 103 } 104 for(i = 0;i < 9;i++) 105 { 106 for(j = 0;j < 9;j++) 107 { 108 if(data[i][j] == 0) 109 { 110 for(x = 1; x <= 9;x++) 111 { 112 if(Check(i,j,x)) 113 { 114 data[i][j] = x; 115 Calc(); 116 } 117 } 118 if(x == 10) 119 { 120 data[i][j] = 0; 121 return ; 122 } 123 } 124 } 125 } 126 } 127 128 int main() 129 { 130 // input(); 131 Calc(); 132 output(); 133 134 return 0; 135 }
上述程序中,数字0表示该位置为空,待填入数字。