现在的位置: 首页 > 综合 > 正文

个人写的一个拼图智能程序

2013年12月13日 ⁄ 综合 ⁄ 共 8259字 ⁄ 字号 评论关闭

这个程序写的不好,在步骤大于6后会出现溢出导致结果的错误,但最近自己也懒得去调试,先把它贴出来聊表己趣。

#include<stdio.h>
#include<malloc.h>
#define X 3
#define Y 3
//结构体申明
// // //
//  // //

typedef struct object
{
 int pic[Y][X],Nu_x,Nu_y, up,dowm,right,left;          
  
    struct object *prior,*pup,*pdowm,*pright,*pleft;
}object;    

typedef struct addresslist
{
 object *list;
 struct addresslist *add;               
}addresslist;           

// // // // // //
int judge(object *pp);
void check(object *pp);
int check_t(object *pp,addresslist *bus);
void show(addresslist *car);

void main()
{

 int i,j,key;
 object obj_start,*obj;
 addresslist add_start,*add_bus,*add_whip,*add_car,*add_start_two;              
    obj=&obj_start;                              //initializing the pointer obj
    printf("please input your number in order/n");  
 for(j=0;j<Y;j++)
    for(i=0;i<X;i++)
       {
        scanf("%d",&obj_start.pic[j][i]);
        if(obj_start.pic[j][i]==0)
        {
         obj->Nu_x=i;obj->Nu_y=j;            
        } 
       }
 check(obj);              
 obj_start.prior=NULL;
 obj_start.pup=NULL;
 obj_start.pdowm=NULL;
 obj_start.pleft=NULL;
 obj_start.pright=NULL;
 add_start.list=obj;                 
 add_bus=&add_start;add_car=add_bus;
 add_start_two=&add_start;
 add_start_two->add=NULL;

 key=0;    

 while(1)
 {
  if(key>362881)
  {
     printf("error:there is something wrong with our system/n");
  break;
  };
  if(judge(add_car->list)==1)break;                 //judeg as the factor of stopping while function
  
  // for up
  if(add_car->list->up==0)
  {
   add_car->list->pup=NULL;
  }
  else
  {
   add_car->list->pup=(object*)malloc(sizeof(object)); 
   for(j=0;j<Y;j++)
   {
    for(i=0;i<X;i++)
    {
     add_car->list->pup->pic[j][i]=add_car->list->pic[j][i];
    }
   }
   add_car->list->pup->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pup->pic[add_car->list->Nu_y-1][add_car->list->Nu_x];
   add_car->list->pup->pic[add_car->list->Nu_y-1][add_car->list->Nu_x]=0;
   if(check_t(add_car->list->pup,add_start_two)==0)
   {
    free(add_car->list->pup);
    add_car->list->pup=NULL;
   }
   else
   {
    add_car->list->pup->Nu_x=add_car->list->Nu_x;
       add_car->list->pup->Nu_y=add_car->list->Nu_y-1;
       add_car->list->pup->prior=add_car->list;
       check(add_car->list->pup);
       add_car->list->pup->pup=NULL;
       add_car->list->pup->pdowm=NULL;
       add_car->list->pup->pright=NULL;
       add_car->list->pup->pleft=NULL;            //these words ensure our system go in order
          add_whip=(addresslist*)malloc(sizeof(addresslist));
          add_whip->list=add_car->list->pup;
    add_whip->add=NULL;
       add_bus->add=add_whip;
                add_bus=add_whip;
       key++;
   }
  }
  
     //for dowm
     if(add_car->list->dowm==0)
  {
   add_car->list->pdowm=NULL;
  }
  else
  {
   add_car->list->pdowm=(object*)malloc(sizeof(object));
   for(j=0;j<Y;j++)
   {
    for(i=0;i<X;i++)
    {
     add_car->list->pdowm->pic[j][i]=add_car->list->pic[j][i];
    }
   }
   add_car->list->pdowm->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pdowm->pic[add_car->list->Nu_y+1][add_car->list->Nu_x];
   add_car->list->pdowm->pic[add_car->list->Nu_y+1][add_car->list->Nu_x]=0;
         if(check_t(add_car->list->pdowm,add_start_two)==0)
   {
    free(add_car->list->pdowm);
    add_car->list->pdowm=NULL;
   }
   else
   {
       add_car->list->pdowm->Nu_x=add_car->list->Nu_x;
       add_car->list->pdowm->Nu_y=add_car->list->Nu_y+1;
       add_car->list->pdowm->prior=add_car->list;
       check(add_car->list->pdowm);
                add_car->list->pdowm->pup=NULL;
       add_car->list->pdowm->pdowm=NULL;
       add_car->list->pdowm->pright=NULL;
       add_car->list->pdowm->pleft=NULL;
          add_whip=(addresslist*)malloc(sizeof(addresslist));
          add_whip->list=add_car->list->pdowm;
    add_whip->add=NULL;
       add_bus->add=add_whip;
                add_bus=add_whip;
       key++;
   }
  }
  
  //for right
  if(add_car->list->right==0)
  {
   add_car->list->pright=NULL;
  }
  else
  {
   add_car->list->pright=(object*)malloc(sizeof(object));
   for(j=0;j<Y;j++)
   {
    for(i=0;i<X;i++)
    {
     add_car->list->pright->pic[j][i]=add_car->list->pic[j][i];
    }
   }
   add_car->list->pright->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pright->pic[add_car->list->Nu_y][add_car->list->Nu_x+1];
   add_car->list->pright->pic[add_car->list->Nu_y][add_car->list->Nu_x+1]=0;
          if(check_t(add_car->list->pright,add_start_two)==0)
   {
    free(add_car->list->pright);
    add_car->list->pright=NULL;
   }
   else
   {
       add_car->list->pright->Nu_x=add_car->list->Nu_x+1;
       add_car->list->pright->Nu_y=add_car->list->Nu_y;
       add_car->list->pright->prior=add_car->list;
       check(add_car->list->pright);
                add_car->list->pright->pup=NULL;
       add_car->list->pright->pdowm=NULL;
       add_car->list->pright->pright=NULL;
       add_car->list->pright->pleft=NULL;
       add_whip=(addresslist*)malloc(sizeof(addresslist));
          add_whip->list=add_car->list->pright;
    add_whip->add=NULL;
       add_bus->add=add_whip;
                add_bus=add_whip;
       key++;
   }
  }
  
  //for left
  if(add_car->list->left==0)
  {
   add_car->list->pleft=NULL;
  }
  else
  {
   add_car->list->pleft=(object*)malloc(sizeof(object));
   for(j=0;j<Y;j++)
   {
    for(i=0;i<X;i++)
    {
     add_car->list->pleft->pic[j][i]=add_car->list->pic[j][i];
    }
   }
   add_car->list->pleft->pic[add_car->list->Nu_y][add_car->list->Nu_x]=add_car->list->pleft->pic[add_car->list->Nu_y][add_car->list->Nu_x-1];
   add_car->list->pleft->pic[add_car->list->Nu_y][add_car->list->Nu_x-1]=0;
   if(check_t(add_car->list->pleft,add_start_two)==0)
   {
    free(add_car->list->pleft);
    add_car->list->pleft=NULL;
   }
   else
   {
       add_car->list->pleft->Nu_x=add_car->list->Nu_x-1;
       add_car->list->pleft->Nu_y=add_car->list->Nu_y;
       add_car->list->pleft->prior=add_car->list;
       check(add_car->list->pleft);
       add_car->list->pleft->pup=NULL;
       add_car->list->pleft->pdowm=NULL;
       add_car->list->pleft->pright=NULL;
       add_car->list->pleft->pleft=NULL;
          add_whip=(addresslist*)malloc(sizeof(addresslist));
          add_whip->list=add_car->list->pleft;
    add_whip->add=NULL;
       add_bus->add=add_whip;
                add_bus=add_whip;add_bus=add_whip;
       key++;
   }
  }
     add_car=add_car->add;
 }
show(add_car);
}
int judge(object *pp)
{
 int i,j;
 for(j=0;j<Y-1;j++)
    for(i=0;i<X;i++)
      {
       if(pp->pic[j][i]!=i+1+j*Y)
   {
    return(0);
   }
      }
       i=0;                       //当输入全正确时的情况完成
 while(i<X-1)
    {
      if(pp->pic[Y-1][i]!=i+1+(Y-1)*X)return(0);      
   i++;
    }
     return(1);

void check(object *pp)
{
 if(pp->Nu_x==0){pp->left=0;}
 else {pp->left=1;}
 if(pp->Nu_x==X-1){pp->right=0;}
 else {pp->right=1;}
 if(pp->Nu_y==0){pp->up=0;}
 else {pp->up=1;}
 if(pp->Nu_y==Y-1){pp->dowm=0;}
 else {pp->dowm=1;}
}

int check_t(object *pp,addresslist *start)                 //this function throw out the same pic which we has get by a circle,
{                                                        //and the success of check_t decites the success of key
 addresslist *obj=start;
 int i,j,dot;
 for(dot=0;;obj=obj->add)
 {
  for(j=0;j<Y;j++)
   {
    for(i=0;i<X;i++)
    {
     if(pp->pic[j][i]!=obj->list->pic[j][i])
      dot=1; 
    }
   }
  if(dot==0)
   return(0);                            //"return(0)" denotes this pic has exited.
  if(obj->add==NULL)return(1);               //the judeg which is used to go out of the biggest f-circle must be located
 }                                               //in it,for we have to jugde the first pic.
}

void show(addresslist *car)
{
 char book[362881],booktrue[362881];
 int i,j;
 object *zys,*zye;
 zys=car->list->prior;
 zye=car->list;
 for(i=0;i<362881;i++)
 {
  book[i]=0;booktrue[i]=0;
 }
 for(i=0;;zys=zys->prior,zye=zye->prior,i++)
 {
  
  if(zys->Nu_x==zye->Nu_x&&zys->Nu_y==zye->Nu_y+1)
  {
   book[i]='u';
  };
  if(zys->Nu_x==zye->Nu_x&&zys->Nu_y==zye->Nu_y-1)
  {
   book[i]='d';
  }
        if(zys->Nu_x==zye->Nu_x-1&&zys->Nu_y==zye->Nu_y)
  {
   book[i]='r';
  }
       if(zys->Nu_x==zye->Nu_x+1&&zys->Nu_y==zye->Nu_y)
  {
   book[i]='l';
    }
    if(zys->prior==NULL)break;
 }   
   for(i=362880,j=0;i>=0;i--)
   {
    if(book[i]==0)
     continue;
    else
    {
     booktrue[j]=book[i];
     j++;
    }
   }
   for(i=0;booktrue[i]!=0;i++)
   {
    if(booktrue[i]=='u')
    {
     printf("↑/n");
     continue;
    };
       if(booktrue[i]=='d')
    {
     printf("↓/n");
     continue;
    };
       if(booktrue[i]=='r')
    {
     printf("→/n");
     continue;
    };
       if(booktrue[i]=='l')
    {
     printf("←/n");
     continue;
    };
   }
   getchar();
}

   
      

抱歉!评论已关闭.