https://github.com/putaoputao303/031702516
实现一个命令行程序,不妨称之为Sudoku。
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
采用了回溯法。思路如下: 设了一个9X9的二维数组a[9][9],然后判断 值k是否可以插入某个点 a[i][j] ①该数组所有横向没有存在过k值 for(n=0;n<9;n++) if(a[i][n]==k)return 0; ②该数组纵向没有存在过k值 for(m=0;m<9;m++) if(a[m][j]==k)return 0; ③该点位于的九宫格3X3区间没有存在过k值 xm=(i/3)3,xn=(j/3)3; for(m=xm;m<xm+3;m++) for(n=xn;n<xn+3;n++) if(a[m][n]==k)return 0; 然后开始搜索的过程:9X9总共81个格子,就用一个数字n作为标记i,j坐标点的变量(i=n/9; j=n%9;),即:80就相当于最后一个格子 8/9=8,8%9=8 如果n等于80,那么就表示已经遍历到最后一个点了,如果满足条件的话就找到最终解了。 如果n不等于80,表示还要继续往下试,即用不同的k值试探当前i,j点是否可以放下,回归后回溯就ok了。
void SD(int a[9][9],int n)//求解
{
int i,j;
int b[9][9];
for(i=0;i<9;i++)
for(j=0;j<9;j++)
b[i][j]=a[i][j]; //用b进行尝试
i=n/9; j=n%9; //行列
if(a[i][j]!=0) //如果该位置固定
(n==80)?print(b):SD(b,n+1);
else
{
int k; //试数
for(k=1;k<=9;k++)
if(test(b,i,j,k)) //可以
{
b[i][j]=k; n==80?print(b):SD(b,n+1); b[i][j]=0; //回溯}
}
} 完整代码如下:
#include<stdio.h>
int count=0;
void print(int a[9][9])
{
count++;
printf("case: %d:\n",count);
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
printf("%d",a[i][j]);
j==2?printf(" "):0;
j==5?printf(" "):0;
j==8?printf("\n"):0;
j==8&&i%3==2?printf("\n"):0;
}
}
//判断是否可以将第i行、第j列的数设为k
int test(int a[9][9],int i,int j,int k)
{
int m,n,xm,xn;
for(n=0;n<9;n++)
if(a[i][n]==k)return 0;
for(m=0;m<9;m++)
if(a[m][j]==k)return 0;
xm=(i/3)3,xn=(j/3)3;
for(m=xm;m<xm+3;m++)
for(n=xn;n<xn+3;n++)
if(a[m][n]==k)return 0;
return 1;
}
void SD(int a[9][9],int n)//求解
{
int i,j;
int b[9][9];
for(i=0;i<9;i++)
for(j=0;j<9;j++)
b[i][j]=a[i][j]; //用b进行尝试
i=n/9; j=n%9; //行列
if(a[i][j]!=0) //如果该位置固定
(n==80)?print(b):SD(b,n+1);
else
{
int k; //试数
for(k=1;k<=9;k++)
if(test(b,i,j,k)) //可以
{
b[i][j]=k; n==80?print(b):SD(b,n+1); b[i][j]=0; //回溯}
}
}
int main()
{
int a[9][9];
printf("请输入原始数据,没有数据用0代替。\n");
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
scanf("%d",&a[i][j]);
printf("-------------------\n\n");
SD(a,0);
if(count==0)
printf("此数独无解!");
return 0;
} 在VS2017下编译运行时总是报错,至今我也不知道因为什么,等问问明白的人再做修改。
GitHub的部分文件导入没查清楚,尝试了很多次真是太难用了,这几天我就看一下github里面的阅读指南,希望可以学会那里的操作,软件工程这门课真是不断让我学习新的东西,每次都是,对我来说作业开始困难起来,可能过几次会熟悉。
转载于:https://www.cnblogs.com/putaoputao/p/11580332.html
相关资源:JAVA上百实例源码以及开源项目