c语言编写的解数独程序

输入数独后程序给出答案。(最好能有思路和算法)... 输入数独后程序给出答案。(最好能有思路和算法) 展开
 我来答
bymwant
2010-04-01 · TA获得超过151个赞
知道小有建树答主
回答量:167
采纳率:0%
帮助的人:127万
展开全部
#include <windows.h>
#include <stdio.h>
#include <time.h>

char sd[81];
bool isok = false;

//显示数独
void show()
{
if (isok) puts("求解完成");
else puts("初始化完成");

for (int i = 0; i < 81; i++)
{
putchar(sd[i] + '0');
if ((i + 1) % 9 == 0) putchar('\n');
}
putchar('\n');
}

//读取数独
bool Init()
{
FILE *fp = fopen("in.txt", "rb");
if (fp == NULL) return false;
fread(sd, 81, 1, fp);
fclose(fp);
for (int i = 0; i < 81; i++)
{
if (sd[i] >= '1' && sd[i] <= '9') sd[i] -= '0';
else sd[i] = 0;
}
show();
return true;
}

//递归解决数独
void force(int k)
{
if (isok) return;
if (!sd[k])
{
for (int m = 1; m <= 9; m++)
{
bool mm = true;
for (int n = 0; n < 9; n++)
{
if ((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]))
{
mm = false;
break;
}
}
if (mm)
{
sd[k] = m;
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}
sd[k] = 0;
}
else
{
if (k == 80)
{
isok = true;
show();
return;
}
force(k + 1);
}
}

int main()
{
system("CLS");
if (Init())
{
double start = clock();
force(0);
printf("耗时%.0fms", clock() - start);
}
else puts("初始化错误");
getchar();
}

参考资料: http://www.shuax.com/?p=1255

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
惠白佴映萱
2019-03-21 · TA获得超过3643个赞
知道大有可为答主
回答量:3114
采纳率:25%
帮助的人:156万
展开全部
#include
<windows.h>
#include
<stdio.h>
#include
<time.h>
char
sd[81];
bool
isok
=
false;
//显示数独
void
show()
{
if
(isok)
puts("求解完成");
else
puts("初始化完成");
for
(int
i
=
0;
i
<
81;
i++)
{
putchar(sd[i]
+
'0');
if
((i
+
1)
%
9
==
0)
putchar('\n');
}
putchar('\n');
}
//读取数独
bool
Init()
{
FILE
*fp
=
fopen("in.txt",
"rb");
if
(fp
==
NULL)
return
false;
fread(sd,
81,
1,
fp);
fclose(fp);
for
(int
i
=
0;
i
<
81;
i++)
{
if
(sd[i]
>=
'1'
&&
sd[i]
<=
'9')
sd[i]
-=
'0';
else
sd[i]
=
0;
}
show();
return
true;
}
//递归解决数独
void
force(int
k)
{
if
(isok)
return;
if
(!sd[k])
{
for
(int
m
=
1;
m
<=
9;
m++)
{
bool
mm
=
true;
for
(int
n
=
0;
n
<
9;
n++)
{
if
((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]))
{
mm
=
false;
break;
}
}
if
(mm)
{
sd[k]
=
m;
if
(k
==
80)
{
isok
=
true;
show();
return;
}
force(k
+
1);
}
}
sd[k]
=
0;
}
else
{
if
(k
==
80)
{
isok
=
true;
show();
return;
}
force(k
+
1);
}
}
int
main()
{
system("CLS");
if
(Init())
{
double
start
=
clock();
force(0);
printf("耗时%.0fms",
clock()
-
start);
}
else
puts("初始化错误");
getchar();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式