求看一段数独游戏的代码,不知哪儿有问题

alan999cy 2013-04-10 06:21:12
#include<stdio.h>

typedef struct stack
{
int top;
int p[100];
}stack;
stack s;//栈
int value[80];
int creat()
{
s.top=0;
return 1;
}
int push(int m)
{
s.p[s.top+1]=m;
s.top=s.top+1;
return 0;
}
int pop()
{
int m;
if(s.top!=0)
{
m=s.p[s.top];
s.top=s.top-1;
return m;
}
else return -1;
}

int kong()
{
if(s.top==0)return 1;
else return 0;
}
//上面为栈函数
//检查一个数是否当前可插入
int judge(int data[],int p,int s,int row[],int line[],int k[],int c[])
{
int i,tag1,tag2,tag3;
int num1=0,num2=0,num3=0;
tag1=line[p/9];//行标
tag2=row[p%9];//列标
tag3=k[p/27*3+p%9/3];//宫标
for(i=0;i<9;i++)
{
if((p!=tag1+row[i])&&(data[tag1+row[i]]!=s))num1++;//行是否插入
if((p!=tag2+line[i])&&(data[tag2+line[i]]!=s))num2++;//列是否插入
if((p!=c[tag3]+k[i])&&(data[c[tag3]+k[i]]!=s))num3++;//宫是否插入
}
if(num1==8&&num2==8&&num3==8)return 1;
else return 0;
}


int back(int data[],int p,int row[],int line[],int k[],int c[],int q)
{
int d,i,j=0,t;
if(p==81)//已插完
{
printf("YES");
for(d=0;d<81;d++)
{
printf("%d ",value[d]);
j++;
if(j%9==0)printf("\n");
}
return 0;
}
if(data[p]!=0)//该数已知,进入下一个位置
{
value[p]=data[p];
back(data,p+1,row,line,k,c,1);
return 0;
}
else
{
for(i=q;i<=9;i++)
if(judge(data,p,i,row,line,k,c))//若当前可插入某一个数,则进栈
{
data[p]=i;
push(p);
value[p]=i;
back(data,p+1,row,line,k,c,1);
return 0;
}
if(i==10)//如当前每一个数都不可以插入且栈非空,则从栈中退出上一个位置,从新插入
{
if(!kong())
{
d=pop();t=value[d];data[d]=0;
back(data,d,row,line,k,c,t+1);
return 0;
}

}
}
}
int main()
{
int row[9]={0,1,2,3,4,5,6,7,8};//行记录
int line[9]={0,9,18,27,36,45,54,63,72};//列记录
int k[9]={0,1,2,9,10,11,18,19,20};//宫记录
int c[9]={0,3,6,27,30,33,54,57,60};//宫起始
int data[85];
int i,j=0;
for(i=0;i<81;i++)
scanf("%d",&data[i]);
creat();

back(data,0,row,line,k,c,1);printf("\n");//回溯


return 0;
}
...全文
121 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧