数独算法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();
}