数独算法c语言代码

首先,步骤:

1.对于每个空格,根据规则推断出它可能填入的数字,并存储其所有可能的值;

2.根据可能值的个数,确定填充顺序。比如有的空格只有一种可能,一定是正确的结果。先把它们填上。

3.填完所有只有一种可能的空格后,回到步骤1,重新确定剩余空格的可能值;

4.当可能空间不止一个(即每个空间有两个以上的可能性)时,按照可能值个数从小到大的顺序,采用深度(广度)优先搜索来完成剩余空间。

二、套路:

#包含?& ltwindows.h & gt

#包含?& ltstdio.h & gt

#包含?& lttime.h & gt

夏尔?SD[81];

布尔?伊索克?=?假的;

//显示数独

作废?显示()

{

如果?(isok)?Puts(“解决方案已完成”);

不然呢?Puts("初始化完成");

为了什么?(int?我?=?0;?我?& lt?81;?i++)

{

putchar(sd[i]?+?'0');

如果?((我?+?1)?%?9?==?0)?putchar(' \ n ');

}

putchar(' \ n ');

}

//读取数独

布尔?初始化()

{

文件?*fp?=?fopen("in.txt ",“Rb”);

如果?(fp?==?NULL)?回归?假的;

fread(sd,81,?1,?FP);

fclose(FP);

为了什么?(int?我?=?0;?我?& lt?81;?i++)

{

如果?(sd[i]?& gt=?'1'?& amp& amp?sd[i]?& lt=?'9')?sd[i]?-=?'0';

不然呢?sd[i]?=?0;

}

show();

回归?真实;

}

//递归求解数独

作废?force(int?k)

{

如果?(isok)?返回;

如果?(!标清[k])

{

为了什么?(int?m?=?1;?m?& lt=?9;?m++)

{

布尔?嗯?=?真实;

为了什么?(int?n?=?0;?n?& lt?9;?n++)

{

如果?((m?==?sd[k/27*27+(k%9/3)*3+n+n/3*6])?||?(m?==?sd[9*n+k%9])?||?(m?==?sd[k/9*9+n])

{

嗯?=?假的;

打破;

}

}

如果?(毫米)

{

sd[k]?=?m;

如果?(k?==?80)

{

伊索克?=?真实;

show();

返回;

}

力(k?+?1);

}

}

sd[k]?=?0;

}

其他

{

如果?(k?==?80)

{

伊索克?=?真实;

show();

返回;

}

力(k?+?1);

}

}

int?主()

{

系统(“CLS”);

如果?(Init())

{

双倍?开始?=?clock();

力(0);

Printf("耗时%.0fms ",时钟()?-?开始);

}

不然呢?Puts("初始化错误");

getchar();

}