大家帮我看看我c语言代码哪里错了

我是c语言小白不要嘲笑我!这里有个c语言解数独的代码,大神帮我看看我哪里错了,还有接下来该怎么写……... 我是c语言小白不要嘲笑我!这里有个c语言解数独的代码,大神帮我看看我哪里错了,还有接下来该怎么写…… 展开
 我来答
契约者之喵
2015-12-11 · 超过12用户采纳过TA的回答
知道答主
回答量:22
采纳率:0%
帮助的人:20.8万
展开全部
#include <stdio.h>
//此处是数独题目,拿0代替,会有一万个答案,可以自己换题
int q[9][9] = {
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
};
//此函数为测试第n个格子可不可以填写check这个数字
bool c(int n,int check)
{
int row,column,n_row,n_column;
row=n/9;
column=n%9;
n_row = row/3 * 3;
n_column = column/3 * 3;

//判断横行和竖列是否有重复
for(int i = 0;i<9;i++)
{
if(q[i][column] == check)
return false;
if(q[row][i] == check)
return false;
}

for(int i = 0;i<3;i++)//判断九宫格是否有重复
{
for(int k = 0;k<3;k++)
{
if(q[n_row+i][n_column+k] == check)
return false;
}
}

return true;
}
//输出答案
void print()
{
printf("===========================================\n");
for(int i =0;i<9;i++)
{
for(int k =0;k<9;k++)
printf("%d ",q[i][k]);
printf("\n");
}
printf("===========================================\n");

}
//此函数的作用是填写第n个格子的答案,共9*9 81个格子
void d(int n=0)
{
//各变量的意思是row=行的下标,column=列的下标,n_row=小九宫格的起始行坐标,n_column=小九宫格的起始列下标
int row,column,n_row,n_column;
//如果填写了全部的格子就输出答案,并返回去寻找其他的答案
if(n>=81)
{
print();
return;
}
//给变量初始化
row=n/9;
column=n%9;
n_row = row/3 * 3;
n_column = column/3 * 3;
//如果这个格子有数字了就不需要寻找答案了(题目中定死数字了)
if(q[row][column]>0)
{
d(n+1);
return;
}
//可以填写1-9,9个数字,依次测试
for(int i = 1;i<=9;i++)
{
if(c(n,i))//如果这个数字可以填,则填写并找下一个
{
q[row][column] = i;
d(n+1);
}
}
q[row][column] = 0;
}


void main()
{
d();
}

有点看不懂你的代码,不知道是不是想记录格子状态来填写,我之前也很想写一个解数独的,查了很多资料,觉得用回溯算法比较简单易懂,而且速度也不错,你可以借鉴一下,注释应该很详细了,有不懂的追问,希望能帮到你

追问
不管怎么着还是谢谢你啦
追答
没事,还有我这个算法就是递归,思想是回溯
1812573723
2015-12-11 · TA获得超过2355个赞
知道小有建树答主
回答量:943
采纳率:88%
帮助的人:909万
展开全部
嘲笑别人的人想来他自己水平也高不到哪里去。
你现在的写的程序是找到第一个空的格子,然后从1到9挨个试哪个数字可以填进去,然后把找到的第一个可以填进去的数字填进去。
应该说你的代码基本实现了你的想法,唯一的问题在于函数judge2()里的第一个for()循环里修改了 r[], l[], gong[] 三个数组的值,这里你希望实现的是临时的改动,但是你的代码做的是永久的改动,这儿应该改正。
如果你继续往下写的话,应该是要实现,每个空的格子并不仅仅是找到第一个可以填的数字填进去,而是每个可以填的数字都要试一遍。
这需要用函数的递归来实现,大概就是把你main()函数里的第二个for()循环写成类似judge2()的函数。
我得说填数独是一个比较难的问题,按照你的思路当然是可以写一个解决数独的程序的,但是可能用你的程序填写一个稍微复杂点的数独要几个小时甚至更多。
要让程序可以很快的填完一个数独要做的事情还有很多,你现在应该先是改正judge2()里的错误,然后将main()函数里的第二个for()循环用函数递归实现,之后再用二维数组把数独的存储改一下,这样程序就可以完成简单的填数独工作了,如果要填高难度的,还要考虑填写顺序什么的,一步一步来吧。
追问
你说的那个递归我还是想不明白该怎么写
追答
……这部分确实挺难的,所以可能你需要先做一些简单的题目,比如八皇后问题。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式