数独程序
//by Arthur
//2011.5
#include<stdio.h>
#include<stdlib.h>
//将大九宫格分成小九宫格
#define CASE1 3
#define CASE2 6
#define CASE3 9
typedef struct cell{
int key;
int state;
}cell; //数独节点,key->填入值,state->数独节点当前状态
int goon=1;//递归方向控制
void shudu(cell (*array)[9],int start);//数独函数,输入参数:由数独节点组成的二维数组;遍历起始点
int main()
{
cell array[9][9];
int i,j;
int temp;
printf("input shudu:\n");
//输入数独,无值处填0
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
scanf("%d",&temp);
array[i][j].key=temp;
if(temp==0)
array[i][j].state=0; //可变更节点
else
array[i][j].state=1; //不可变更节点
}
shudu(array,0);//遍历起始点->0
//打印结果
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
printf("%d",array[i][j].key);
if(j==8)
printf("\n");
else
printf(" ");
}
return EXIT_SUCCESS;//成功退出
}
void shudu(cell (*array)[9],int start)
{
if(start==81)//回溯终止条件
{
printf("got it \n");
return;
}
//将节点序号变换为对应的行列值
int row=start/9;
int column=start%9;
if(array[row][column].state==1)//不可变更状态
{
if(goon==1)//遍历下一个节点
{
shudu(array,++start);
}
else
{
if(start==0)//无结果
{
return;
}
else//回溯
{
shudu(array,--start);
}
}
}
else//可变更节点
{
int i;
for(i=array[row][column].key+1;i<10;i++)//测试可用值
{
int state1=1,state2=1,state3=1;
int p,q;
for(p=0;p<9;p++)
{
if((array[p][column].key==i)&&(p!=row))//检验行冲突
{
state1=0;
break;
}
if((array[row][p].key==i)&&(p!=column))//检验列冲突
{
state2=0;
break;
}
}
int row_l,column_l;
//确定所在小方块
if(row<CASE1)
{
row_l=CASE1;
}
else if(row<CASE2)
{
row_l=CASE2;
}
else
{
row_l=CASE3;
}
if(column<CASE1)
{
column_l=CASE1;
}
else if(column<CASE2)
{
column_l=CASE2;
}
else
{
column_l=CASE3;
}
//检验小方块内冲突
for(p=row_l-3;p<row_l;p++)
for(q=column_l-3;q<column_l;q++)
{
if((array[p][q].key==i)&&!(p==row&&q==column))
{
state3=0;
p=row_l;
q=column_l;
}
}
if((state1==1)&&(state2==1)&&(state3==1))//无冲突
{
break;
}
}
if(i==10)//当前节点无可用值,回溯
{
array[row][column].key=0;
goon=-1;
shudu(array,--start);
}
else//当前节点存在可用值,遍历下一个节点
{
array[row][column].key=i;
goon=1;
shudu(array,++start);
}
}
}
好久没写博客了,想把过去在各个地方写的东西先搬过来,目前的主要工作就是“搬家”。