2011年度变态迷宫数学题:从左边入口处的 2011 进去,在迷宫里转悠,最后变成 2012 从右边出来。你可以在迷宫里转圈,可以重复之前走过的路,但不能往回退着走。

 

 

c语言解答过程如下:

 

#include <stdio.h>
int select(int a,int b){
  switch(b){
    case 2: return a/b;
    case 3: return a*b;
    case 5: return a-b;
    case 7: return a+b;
   }
   return 0; 
}

typedef struct element{
  int id;
  int parent;
  int oper;
  int stat;
  int result;
  struct element *next;
}node;

int* opers(int o,int s){
  int ops[3]={0.0.0};
  switch(o){
    case 2: if(s==0){ops[0]=3;ops[1]=5;ops[2]=7;}else ops[0]=7;break;
    case 3: if(s==0)ops[0]=5;else {ops[0]=2;ops[1]=5;ops[2]=7;}break;
    case 5: if(s==0)ops[0]=3;else {ops[0]=2;ops[1]=3;ops[2]=7;}break;
    case 7: if(s==0){ops[0]=2;ops[1]=3;ops[2]=5;}else ops[0]=2;break;
    default: ops[0]=2;ops[1]=7;break; 
  } 
  return ops; 
}

int setstat(int a,int ha,int hs){
  int s=0; 
  switch(a){
   case 2:if(ha==3||ha==5||(ha==7&&hs==0))s=1;break;
   case 3:if(ha==5&&hs==0)s=1;break;
   case 5:if(ha==3&&hs==0)s=1;break; 
   case 7:if(ha==3||ha==5||(ha==2&&hs==0))s=1;break;  
  }
  return s; 
}


int isout(node *p){
  if(p==NULL)return 0;  
  return ((p->stat==0)&&(p->oper==3||p->oper==5)); 
}

node * searching(int a,int b){
  node *head,*t,*p=(node *)malloc(sizeof(node));
  int o,s;
  p->id = 0;
  p->parent = -1;
  p->oper=0;
  p->stat=0;
  p->result=a;
  p->next=NULL;
  head=p;t=p;
  int index=0;
  while(t->result!=b||!isout(t)){     
    int *op=opers(t->oper,t->stat);
    int a[3];a[0]=op[0];a[1]=op[1];a[2]=op[2];
    int i=0;   
    for(i=0;i<3&&a[i];i++){   
      o = a[i]; if(o==2&&t->result%2!=0)continue;   
      s = setstat(o,t->oper,t->stat);
      node * n =(node *)malloc(sizeof(node));
      n->id = ++index;
      n->parent = t->id;
      n->oper=o;
      n->stat=s;
      n->result = select(t->result,o);
      p->next=n;
      p=p->next;
    }
    t=t->next;
 
  }
  t->next=NULL;
 
  return head;  
}

node * found(node * p,int b){
  node *head=p,*t=p;
  while(t!=NULL&&t->result!=b||!isout(t)) t=t->next;
  head = t;t = p;head->next=NULL;
  while(t!=NULL&&head->parent>=0){
    while(t!=NULL&&head->parent!=t->id)t=t->next; 
    t->next=head;
    head = t;
    t=p;
  }
  return head;
}
print(int op){
 switch(op){
    case 2: printf("/2");break;
    case 3: printf("*3");break;
    case 5: printf("-5");break;
    case 7: printf("+7");break;
   }  
}

int isnum(char* ns){
  int i; 
  for(i=0;i<strlen(ns);i++)
    if(ns[i]<'0'||ns[i]>'9')return 0; 
  return 1; 
}
 
void main(int argc,char* argv[]){
  int X=2011,Y=2012;
  if(argc==3||argc==4){
    if(!isnum(argv[1])){printf("Parameter 1 not correct!");return;}
    if(!isnum(argv[2])){printf("Parameter 2 not correct!");return;}  
    X=atoi(argv[1]);Y=atoi(argv[2]);
  }
 
  node * p=found(searching(X,Y),Y);

  if(argc==1||argc==3){
    printf("%d=%d",Y,X);
    while(p!=NULL){
      print(p->oper);
      p=p->next;
    }
  }
  else if((argc==2&&!strcmp(argv[1],"-d"))||(argc==4&&!strcmp(argv[3],"-d"))){
    printf("%d",p->result);  
    while(p!=NULL){
      p=p->next;
      if(p!=NULL){ 
        print(p->oper);
        printf("=%d",p->result);
      }
   }
  }
  
  else printf("Bad parameter!"); 
  return;
}

运行结果:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值