九宫图算法

///
// 九宫图算法;
//

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//
     the function defination
//

void create(int [][3]);
void show(int [][3]);
void set_value(int [][3]);
void aim_get(int [][3]);
void target(int [][3]);
void judge_x1(int [][3]);
void judge_x2(int [][3]);
void judge_x3(int [][3]);
void judge_x4(int [][3]);
void judge_x5(int [][3]);
void shift_all(int [][3]);
void shift_low_six(int [][3]);
void anti_shift_all(int [][3]);
void shift_low_four(int [][3]);
void last_shift(int [][3]);
void set_x5(int [][3]);

///
//    the main function body 

main()
{
 
 srand(time(NULL));
 int cDiagram[3][3];
 create(cDiagram);     ///   creat the new array ,set the value are 10;
 set_value(cDiagram);
 //last_shift(cDiagram);
 return 0;
}

///
///  建立一个3*3数组,初值都设为10;//
//

void create(int array[][3])
{
 printf("/n/n***********************************/n/n");
    printf("九宫图算法实现过程/n/n");
 printf("***********************************/n/n");
 
    int line;
 int row;
 
 for(line=0;line<3;line++)
 {
  for(row=0;row<3;row++)
  {
   array[line][row]=10;
  }
 }
    // set_value(array);
 //show(array);
}

/
///  显示数组状态 

void show(int array[][3])
{  
 for(int i=0;i<3;i++)
 {
  for(int j=0;j<3;j++)
  {
   printf("%3d",array[i][j]);
   
  }
  printf("/n/n");
 }
 
 
}

///
/// 产生数组的初始状态  ///
///

void set_value(int array[][3])
{
 int i=0;
 int rand_num_line;
    int rand_num_row;
 
 printf("    /n/n九宫图的初始值为:/n/n");
 
 while(i<=8)
 {
  rand_num_line=rand()%3;
  rand_num_row=rand()%3;
  
  if(array[rand_num_line][rand_num_row]!=i&& array[rand_num_line][rand_num_row]==10)
  {
   array[rand_num_line][rand_num_row]=i;
   ++i;
  }
  
 }
 
 show(array);
 //printf(" let's begin!!/n");
    aim_get(array);
}


  judge the initial array get the target or no !  ///
//


void aim_get(int array[][3])
{
 int aim[3][3]={{1,2,3},{8,0,4},{7,6,5}};
 int line;
 int row;
 int judge=0;
 for(line=0;line<3;line++)
 {
  for(row=0;row<3;row++)
  {
   if(array[line][row]!=aim[line][row])
   {
    judge=1;
   }
  }
 }
 if(judge==1)
 {
  judge_x1(array);
 }
 else
 {
  target(array);
  
  
 }
}


/
/// the target diagram //
/


void target(int array[][3])
{
 printf("/n/n     the last diagram is :/n");
 show(array);
}



///judge the x1 is 1 or no!  ///

void judge_x1(int array[3][3])
{
 //int x1=1;
 
 int temp;
 //printf("  /n/n/n the array[0][2]=%d/n/n",array[0][2]);
 
 if(array[0][2]!=1 && array[0][2]!=0)              // x3!=1 || x3!=0;
 {
  
  while(array[0][0]!=1)
  {  
   //printf("i am here!!1");
   temp=array[0][0];
   array[0][0]=array[0][1];
   array[0][1]=array[1][1];
   array[1][1]=array[1][2];
   array[1][2]=array[2][2];
   array[2][2]=array[2][1];
   array[2][1]=array[2][0];
   array[2][0]=array[1][0];
   array[1][0]=temp;
  }
 }
 else
 {     
  
  if(array[0][2]==0)                       // x3==0;
  {
   // printf("/n/n array[0][2]=0/n/n");
   temp=array[0][2];
   array[0][1]=array[0][2];
   array[0][2]=temp;
   judge_x1(array);
   goto tt;
  }
  else                                    /// x3==1;
  {   //printf("/n/narray[0][2] should is 1,   %d",array[0][2]);
   if(array[1][1]==0)                  x0==0;
   {
    temp=array[0][1];
    array[0][1]=array[1][1];
    array[1][1]=temp;
    judge_x1(array);
   }
   else                                x3==1 && x0!=0;
   {   
    shift_all(array);
    judge_x1(array);
   }
   
  }
 }
 printf("  确定了X1位置后,九宫图为:/n");
 show(array);
 judge_x2(array);
tt:
 int p=1;
}


//
/// judge the x2's position /
//

void judge_x2(int array[][3])
{
 int temp;
 
 while(array[0][1]!=2)
 {
  temp=array[0][1];
  array[0][1]=array[0][2];
  array[0][2]=array[1][2];
  array[1][2]=array[2][2];
  array[2][2]=array[2][1];
  array[2][1]=array[2][0];
  array[2][0]=array[1][0];
  array[1][0]=array[1][1];
  array[1][1]=temp;
 }
 printf("  确定了X2位置后,九宫图为: /n");
 show(array);
 judge_x3(array);
 
}


///
/       shift from array[1][0] to array[2][2] 
///

void shift_low_six(int array[][3])
{
 int temp;
 temp=array[1][0];
 array[1][0]=array[1][1];
 array[1][1]=array[1][2];
 array[1][2]=array[2][2];
 array[2][2]=array[2][1];
 array[2][1]=array[2][0];
 array[2][0]=temp;
 
 
}

 


   shift from array[0][0]  to array[2][2]  /

void shift_all(int array[][3])
{
 int temp;
 
 temp=array[0][0];
 array[0][0]=array[0][1];
 array[0][1]=array[0][2];
 array[0][2]=array[1][2];
 array[1][2]=array[2][2];
 array[2][2]=array[2][1];
 array[2][1]=array[2][0];
 array[2][0]=array[1][0];
 array[1][0]=temp;
}

 

//
/// shift aiti-direction ///

void anti_shift_all(int array[][3])
{
 int temp;
 
    temp=array[1][0];
 array[1][0]=array[2][0];
 array[2][0]=array[2][1];
 array[2][1]=array[2][2];
 array[2][2]=array[1][2];
 array[1][2]=array[0][2];
 array[0][2]=array[0][1];
 array[0][1]=array[0][0];
 array[0][0]=temp;       
}

//
/      judge x3's position     ///
//

void judge_x3(int array[][3])
{
 
 int line;
 int row;
 int temp;
 if(array[0][2]!=3)
 {
  while(array[1][1]!=3)                      // shift the int ,untill 3 stay in x0
  {
   shift_low_six(array);
  }
  for(int i=0;i<=2;i++)
  {
   for(int j=0;j<=2;j++)
   {
    if(array[i][j]==0)
    {
     line= i;
     row=j;
    }
   }
  }
  if(line==0&&row==2)
  {
            shift_all(array);
   
  }
  else if(line==1&&row==2)
  {
   shift_all(array);
   temp=array[0][1];
   array[0][1]=array[0][2];
   array[0][2]=temp;
  }
  else if(line==2&&row==2)
  {
   shift_all(array);
   temp=array[1][2];
   array[1][2]=array[0][2];
   array[0][2]=array[0][1];
   array[0][1]=temp;
  }
  else if(line==2&&row==1)
  {
   shift_all(array);
   temp=array[2][2];
   array[2][2]=array[1][2];
   array[1][2]=array[0][2];
   array[0][2]=array[0][1];
   array[0][1]=temp;
  }
  else if(line==2&&row==0)
  {
   array[2][0]=array[1][0];
   array[1][0]=array[0][0];
   array[0][0]=array[0][1];
   array[0][1]=0;
  }
  else
  {
   array[1][0]=array[0][0];
   array[0][0]=array[0][1];
   array[0][1]=0;
  }
  
  array[0][1]=3;
  array[1][1]=0;
  anti_shift_all(array);
 }
 
 printf("   确定了X3位置后,九宫图为:/n");
 show(array);
 judge_x4(array);
}


//
//   judge x4's position    ///
/


void judge_x4(int array[][3])
{
 while(array[1][2]!=4)
 {
  shift_low_six(array);
 }
 printf("  确定了X4位置后,九宫图为:/n");
 show(array);
 judge_x5(array);
}
/
//    shift_low_four    /
/
void shift_low_four(int array[][3])
{
 int temp;
 
 temp=array[1][1];
 array[1][1]=array[2][1];
 array[2][1]=array[2][0];
    array[2][0]=array[1][0];
    array[1][0]=temp;
 
}
//
//     judge x5's position     ///
//
void judge_x5(int array[][3])
{
 if(array[2][2]==0)
 {
  while(array[1][1]!=5)
   shift_low_four(array);
  shift_all(array);
  set_x5(array);
 }
 else if(array[2][2]!=5)
 {  
  while(array[1][1]!=5)
   shift_low_four(array);
  if(array[2][1]==0)
  {
   shift_all(array);
   array[2][2]=array[1][2];
   set_x5(array);
  }
  else if(array[2][0]==0)
  {
   shift_all(array);
   array[2][1]=array[2][2];
   array[2][2]=array[1][2];
   set_x5(array);
  }
  else if(array[1][0]==0)
  {
   shift_all(array);
   array[2][0]=array[2][1];
   array[2][1]=array[2][2];
   array[2][2]=array[1][2];
   set_x5(array);
   
  }
 }
 
 printf("  确定了X5位置后,九宫图为:/n");
 show(array);
 last_shift(array);
 
}


void set_x5(int array[][3])
{
 array[1][2]=5;
    array[1][1]=0;
    anti_shift_all(array);
}
/*
void judge_x7(int array[][3])
{
if(array[2][2]!=0 || array[2][2]!=5)    //x5!=0||x5!=5
{  
while(array[1][1]!=5)             
{
shift_low_four(array);
}
if(array[2][1]==0)
{
shift_all(array);
array[2][2]=array[1][2];
array[1][2]=0;
}
else
if(array[2][0]==0)
{
shift_all(array);
array[2][1]=array[2][2];
array[2][2]=array[1][2];
array[1][2]=0;

  }
 
 else
 {
    if(array[1][0]==0)
    {
 array[1][0]=array[0][0];
 array[0][0]=array[0][1];
 array[0][1]=array[0][2];
 array[0][2]=array[1][2];
 array[1][2]=0;   
    }
 }
 array[1][2]=5;
 array[1][1]=0;
 printf("/nthe array[2][1]=%d/n",array[2][1]);
 show(array);
 //anti_shift_all(array);
 printf("/nthe array[2][1]=%d/n",array[2][1]);
 
   }
   else   
   if(array[2][2]==0)               //x5==5
   {
   while(array[2][1]!=5)
   {
   shift_low_four(array);
   }
   array[2][2]=5;
   array[2][1]=0;
   }
   }
   printf("  确定了X5位置后,九宫图为:/n");
   show(array);
   last_shift(array);
*/

/
///         last_shift   ///
// to determine the last four numbers//
/  x6,x7,x8,x0         
/

void last_shift(int array[][3])
{  
 int temp;
 while(array[2][1]!=6)
 {
  shift_low_four(array);
 }
 
 if(array[1][1]!=0)
 {
  if(array[1][0]==0)
  {
   temp=array[1][0];
   array[1][0]=array[1][1];
   array[1][1]=temp;
  }
  else
  {
   array[2][0]=array[1][0];
   array[1][0]=array[1][1];
   array[1][1]=0;
  }
 }
 
 printf("***********************************/n");
 printf("***********************************/n/n");
 printf("  经过计算,最终的九宫图为: /n");
 show(array);
 if(array[2][0]==7)
 {
  
  printf("****************************/n");
  printf("**  此为九宫图的最终解!  **/n");
  printf("****************************/n");
 }
    else
 {
  printf("****************************/n");
  printf("**  对不起,此无解九宫图!**/n");
  printf("****************************/n");
 }
 
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值