C语言数独问题,100分求教

麻烦了,只能用C语言,不能C++,尽量简单些... 麻烦了,只能用C语言,不能C++,尽量简单些 展开
 我来答
虎爷可乐
推荐于2016-08-15 · TA获得超过253个赞
知道小有建树答主
回答量:238
采纳率:66%
帮助的人:144万
展开全部

花了点时间,总算写出来了,不知道和你要的意思一不一样,这次应该没问题了:

#include<stdio.h>

char Flag[2][9][9] = {0};
char Sudu[3][3][3][3] = {0};

int roll(int row, int col, int i, int j, char num, int e){
printf("\n第 %d 行第 %d 列的 %c 不合理!", i + 1, j + 1, num);
switch(e){
case 5:
printf("九宫格内数字重复");
break;
case 7:
printf("数独行内数字重复");
break;
case 9:
printf("数独列内数字重复");
break;
}
printf("\n(回车键继续,任意字符回车退出):");
if(getchar() != '\n'){
while(getchar() != '\n');
return e;
}

//清除整个数独行列标记
char (*unit)[3] = Sudu[row][col];
if(e > 5){
//循环整个九宫格
while(i >= 0){
//循环九宫格清除行列标记
while(--j >= 0){
char c = unit[i][j] - '1';
e = row * 3 + i;
Flag[0][e][c] = 0;
e = col * 3 + j;
Flag[1][e][c] = 0;
}
j = 3;
i--;
}
}

return sd(row, col);
}

int sd(int row, int col){
char num, flag[9] = {0};
char (*unit)[3] = Sudu[row][col];

int i, j, x;
static tip = 1;
if(tip){ tip = 0;
printf("123\n456\n789\n请按如上格式(下同)输入\n\n");
}
printf("第 %d 行第 %d 个九宫格:\n", row + 1, col + 1);
scanf("%s\n%s\n%s", unit[0], unit[1], unit[2]); getchar();
printf("第 %d 行第 %d 个九宫格", row + 1, col + 1);

//循环整个九宫格
for(i = 0; i < 3; i++){
//循环九宫格每行是否合法
for(j = 0; j < 3; j++){
num = unit[i][j];
if(num < '1' || num > '9'){
printf("\n只能输入 1 - 9 的数字!");
return roll(row, col, i, j, num, 1);
}
//判断数独单元是否合理
if(flag[num - '1']){
return roll(row, col, i, j, num, 5);
}else{
flag[num - '1'] = 1;
}
//判断整个数独中单元所在行是否合理
x = row * 3 + i;
if(Flag[0][x][num - '1']){
return roll(row, col, i, j, num, 7);
}else{
Flag[0][x][num - '1'] = 1;
}
//判断整个数独中单元所在列是否合理
x = col * 3 + j;
if(Flag[1][x][num - '1']){
return roll(row, col, i, j, num, 9);
}else{
Flag[1][x][num - '1'] = 1;
}
}
}
printf("输入完成\n");
return 0;
}

int main(){
int i, j;
int x, y;
//循环整个数独
for(i = 0; i < 3; i++){
//循环每行数独九宫格
for(j = 0; j < 3; j++){
//数独九宫格输入和测试
if(x = sd(i, j)){
return x;
}
}
}

printf("\n输入全部通过");
printf("\n完整的数独如下:");
//循环输出整个数独
for(x = 0; x < 3; x++){
printf("\n");
//循环九宫格一列
for(i = 0; i < 3; i++){
//输出数独一整行
for(y = 0; y < 3; y++){
//输出九宫格一行
for(j = 0; j < 3; j++){
printf("%c ", Sudu[x][y][i][j]);
}
printf(" ");
}
printf("\n");
}
}
return 0;
}
梦缘Lovely
2014-12-20
知道答主
回答量:64
采纳率:0%
帮助的人:16.5万
展开全部
//回溯法希望对你有所帮助
//借用别人的http://tieba.baidu.com/p/2438325270
#include<stdio.h>
#include<stdlib.h> int judge=0;
//输出可行的解
void print(int a[9][9])
{
int i,j;
printf("数独的解为:\n");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
judge=1;
}

//判断是否可以将第i行、第j列的数设为 k
int check(int a[9][9],int i,int j,int k)
{
int m,n;
//判断行
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;
}
//判断所在小九宫格
int t1=(i/3)*3,t2=(j/3)*3;
for(m=t1;m<t1+3;m++)
{
for(n=t2;n<t2+3;n++)
{
if(a[m][n] == k)
return 0;
}
}
//可行,返回true
return 1;
}

//深度优先搜索求解数独
void shudu(int a[9][9],int n)
{
int i,j,k,t;
i=n/9; j=n%9; //求出第n个数的行数和列数
if(a[i][j] != 0) //已经有原始数据
{
if(n == 80) //是最后一个格子,输出可行解
print(a);
else //不是最后一个格子,求下一个格子
shudu(a,n+1);
}
else //没有数据
{
for(k=1;k<=9;k++)
{
t=check(a,i,j,k);
if(t&&judge==0) //第i行,第j列可以是k
{
a[i][j]=k; //设为k
if(n == 80)
print(a);
else
shudu(a,n+1);
a[i][j]=0; //恢复为0,判断下一个k值
}
}
}
}

int main()
{
char q;
int i,j;
int a[9][9];
for(i = 0 ; i < 9 ; i++)
{
for(j = 0 ; j < 9 ; j++)
{
scanf("%c",&q);
a[i][j]=q-48;
}
getchar();
}
shudu(a,0);
system("pause");
return 0;
}
追问
没用,连个输入都没有
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式