九宫图算法

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

#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”);
 }
 
}

 

    原文作者:九宫图算法
    原文地址: https://blog.csdn.net/iu_81/article/details/1522993
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞