数独程序

//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);
 
     }
 
  
 
   }
  
 
}
posted @ 2012-08-18 15:05  ArthurSJiang  阅读(253)  评论(0编辑  收藏  举报