永发信息网

生成数独方阵的c代码,请问为什么会死循环,实在看不出来了

答案:2  悬赏:80  手机版
解决时间 2021-04-08 11:55
  • 提问者网友:溺爱和你
  • 2021-04-07 14:04
#include

#include

#include

main()

{

int a[9]={1,2,3,4,5,6,7,8,9};
int b[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}};

int n,i=0,j=0,p,q,r,t,k=0;

srand((unsigned)time(NULL));

while(b[8][8]==0)
{
r=0;

n=rand()%(9-k);
b[i][j]=a[n];
a[n]=0;
for(p=0;p<8;p++)
{
for(q=0;q<8-p;q++)
{
if(a[q] {
t=a[q];
a[q]=a[q+1];
a[q+1]=t;
}
}
}

for(p=j;p>0;p--)
{
if(b[i][j]==b[i][p-1])
r++;
}
for(p=i;p>0;p--)
{
if(b[i][j]==b[p-1][j])
r++;
}

if((i!=0) && (i!=3) && (i!=6))
{
if((i==1) || (i==4) || (i==7))
{
for(q=(j/3)*3;q<(j/3)*3+3;q++)
{
if(b[i][j]==b[i-1][q])
r++;
}
}
else
{
for(p=(i/3)*3;p<(i/3)*3+2;p++)
{
for(q=(j/3)*3;q<(j/3)*3+3;q++)
{
if(b[i][j]==b[p][q])
r++;
}
}
}
}

if(r==0)
{
j++;
a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;a[6]=7;a[7]=8;a[8]=9;
}
else
{
k++;
b[8][8]=0;
}

if(k>=9)
{
k=0;
a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;a[6]=7;a[7]=8;a[8]=9;
b[8][8]=0;
if(j==0)
{
i--;
j=8;
}
else
j--;

}

if(j==9)
{
i++;
j=0;
}

}

for(i=0;i<9;i++)
{for(j=0;j<9;j++)
printf("%d ",b[i][j]);
printf("\n");}

getch();

}
最佳答案
  • 五星知识达人网友:神鬼未生
  • 2021-04-07 15:38
同一个问题,在两处问的?
代码错误太多啦~~~~~~~~
还有,
像你这种算法,从头开始填,填掉最后每次都要保证没冲突,到后面会发现根本没办法填下去的。
因为前面基本看不出什么冲突,到后面发现会处处冲突。这样随机随下来能得到一个数独矩阵的概率太小了。。
提供你一个思路,先假设每个个格子有九种可能,当某个格确定为一个确定的数时,比如随机出一个6,那么就把这个6同行的6,同列的6,同九宫格的6的可能性都删掉。以后给每个格随机取值时,都在可能性范围内取,这样下来才有可能得到争取结果。(不过到最后还是可能会有冲突,需要回溯,但明显回溯的复杂度比你原来那个小得多)
全部回答
  • 1楼网友:低音帝王
  • 2021-04-07 16:13
同问。。。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯