论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

九宫图算法实现(过程表示法)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:45:16

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

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

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058