赞
踩
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。 如有多解,输出一个解
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出九行,每行九个空格隔开的数字,为解出的答案。
8 1 5 0 0 3 2 9 0
0 6 7 0 0 0 0 0 0
9 0 2 5 0 0 0 0 6
0 0 0 4 0 8 0 0 0
6 0 4 0 0 0 8 0 9
0 0 0 2 0 9 0 0 0
7 0 0 0 0 1 0 0 8
0 0 0 0 0 0 3 7 0
1 5 3 8 0 0 0 4 2
8 1 5 6 4 3 2 9 7
4 6 7 1 9 2 5 8 3
9 3 2 5 8 7 4 1 6
3 9 1 4 6 8 7 2 5
6 2 4 7 1 5 8 3 9
5 7 8 2 3 9 1 6 4
7 4 9 3 2 1 6 5 8
2 8 6 9 5 4 3 7 1
1 5 3 8 7 6 9 4 2
玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复
#include<stdio.h> #include<stdbool.h> #define SIZE 9 int Board[SIZE][SIZE]; int main() { int i,j; for(i=0;i<SIZE;i++){ for(j=0;j<SIZE;j++){ scanf("%d",&(Board[i][j])); } } if(Backtrack(0,0)){ for(i=0;i<SIZE;i++){ for(j=0;j<SIZE;j++){ if(j!=0){ printf(" "); } printf("%d",Board[i][j]); } printf("\n"); } } return 0; }
bool Backtrack(int i,int j) { if(i == SIZE ){//行数为9时,推出递归 return true; } int Next_i,Next_j; if(Board[i][j]==0){ int k; for(k=1;k<10;k++){//1——9循环尝试 if(IsConform(i,j,k)){//判断k是否符合游戏规则 Board[i][j]=k; if(j<8){//进入下一个位置 Next_i=i; Next_j=j+1; }else{ Next_i=i+1; Next_j=0; } if(Backtrack(Next_i,Next_j)){ return true; }else{//下一个位置尝试失败时,要从上一步更改尝试值 Board[i][j]=0; } } } }else{ if(j<8){ Next_i=i; Next_j=j+1; }else{ Next_i=i+1; Next_j=0; } if(Backtrack(Next_i,Next_j)){ return true; }else{ return false; } } return false; }
说明:判断尝试值k是否符合游戏规则
bool IsConform(int i,int j,int k) { int u,v; for(u=0;u<SIZE;u++){ if(Board[i][u]==k||Board[u][j]==k){ return false; } } for(u=i/3*3;u<i/3*3+3;u++){ for(v=j/3*3;v<j/3*3+3;v++){ if(Board[u][v]==k){ return false; } } } return true; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。