码迷,mamicode.com
首页 > 其他好文 > 详细

数独求解

时间:2015-03-10 19:18:55      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

 

  1 #include <stdio.h>
  2 
  3 #define false    (0)
  4 #define true     (1)
  5 
  6 int sudoku[9][9]={
  7     0, 7, 1, 0, 5, 9, 0, 0, 4,
  8     2, 0, 0, 0, 0, 0, 0, 0, 0,
  9     0, 4, 0, 7, 0, 0, 6, 0, 0,
 10     0, 0, 0, 5, 1, 0, 9, 4, 0,
 11     0, 6, 8, 0, 0, 0, 1, 5, 0,
 12     0, 5, 9, 0, 8, 4, 0, 0, 0,
 13     0, 0, 2, 0, 0, 5, 0, 1, 0,
 14     0, 0, 0, 0, 0, 0, 0, 0, 3,
 15     3, 0, 0, 4, 9, 0, 5, 2, 0,    
 16 };
 17   
 18 //判断填在空白位置的数字在行、列上是否符合要求
 19 int Judge1(int x, int y, int n)
 20 {
 21     int i;
 22     
 23     for(i=0;i<9;i++)
 24     {
 25         //判断 列
 26         if((sudoku[i][y]==n)&& (i!=x))
 27             return false;
 28         //判断 行
 29         if((sudoku[x][i]==n)&& (i!=y))
 30             return false;
 31     }
 32     
 33     return true;
 34 }
 35   
 36 //判断填在空白位置的数字在九宫格之内是否符合要求
 37 int Judge2(int x, int y, int n)
 38 {
 39     int xx,yy,i,j;
 40     xx=x/3;
 41     yy=y/3;
 42     for(i=xx*3;i<xx*3+3;i++)
 43         for(j=yy*3;j<yy*3+3;j++)
 44             if(sudoku[i][j]==n)
 45                 if(i==x&& j==y)
 46                     continue;
 47                 else
 48                     return false;
 49     return true;
 50 }
 51   
 52 // 填充空白数组
 53 int Fill(int m)
 54 {
 55     int n,x,y;
 56     
 57     x = m / 9; // 行号
 58     y = m % 9; // 列号
 59     
 60     if (m>=81)
 61         return true;
 62         
 63     if (sudoku[x][y]==0)
 64     {
 65         for(n = 1; n <= 9; n++)
 66         {
 67             sudoku[x][y] = n; // 从1到9尝试填入数据
 68             
 69             if(Judge1(x, y, n) && Judge2(x, y, n)) // 如果当前填入的数据符合要求,则尝试填入下一个数据
 70             {
 71                 if(Fill(m+1))
 72                     return true;
 73             }
 74             sudoku[x][y]=0;
 75         }
 76     }
 77     else
 78     {
 79         return Fill(m+1);
 80     }
 81     
 82     return false;
 83 }
 84 
 85 void show_sudoku(int sudoku[9][9])
 86 {
 87     int i;
 88     
 89     for(i = 0; i < 12; i++)
 90         printf("__");
 91     printf("\n");
 92     
 93     for(i = 0; i < 9; i++)
 94     {
 95         for(j = 0; j < 9; j++)
 96         {
 97             printf("%d ", sudoku[i][j]);    
 98             if((j+1)%3 == 0)
 99                 printf("| ");
100         }    
101         printf("\n");
102         
103         if((i+1)%3 == 0)
104         {
105             for(k=0;k<12;k++)
106                 printf("__");
107             printf("\n");
108         }
109     }    
110 }
111 
112 int main(void)
113 {
114     //输入初始数独
115     int i,j,k;
116     
117     //printf("输入初始数独数据,空白用0代替\n");
118 #if 0
119     for(i=0;i<9;i++)
120     {
121         for(j=0;j<9;j++)
122         {
123             //cin>>sudoku[i][j];
124             scanf("%d", &sudoku[i][j]);
125             printf(" ");
126         }
127         printf("\n");
128     }
129 #endif
130     printf("初始数独数据:\n");
131     show_sudoku(sudoku);
132     
133     printf("\n求解得数独数据:\n");
134 
135     if(Fill(0))//填充数独的空白位置完毕
136     {
137         show_sudoku(sudoku);
138     }
139     else
140     {
141         printf("该数独无解,请注意游戏规则或检查原始数独是否有误\n");
142     }
143     
144     return 0;
145 }

 

数独求解

标签:

原文地址:http://www.cnblogs.com/utank/p/4326696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!