广搜 研究了满久才明白 道理简单实现不容易啊 小错误很多改了好久
1:剪枝(不减太浪费时间容易超时)
(1):如果a>b 直接输出a-b 因为没步只能-1
(2):如果出现过的就标记 不计了
2:要放掉空间 free(p1); 可以省点就省点吧
 
3:跳出的判断 如果队列为空就跳出 (没这步我是一直的 运行错误)

#include<stdio.h>
#include<stdlib.h>
int c[200000],a1,b;     
struct t
{
 int num;
 int time;
 struct t *next;
}*p1,*p2,*q,*p;
struct t *stack(struct t *x)
{
 x=(struct t*)malloc(sizeof(struct t));
 x->num=a1;
 x->time=0;
 return x;
}
void bfs(struct t *x)
{
 int a;
 p=x;
 c[a1]=1;
 while(1)
 {

  a=p->num+1;
  x->next=NULL;
  if(c[a]==0&&a<=100000)
  {
   c[a]=1;
   x->next=(struct t*)malloc(sizeof(struct t));
   x=x->next;
   x->num=a;
   x->time=p->time+1;
    if(x->num==b)
    {
    printf("%d",x->time);
    return ;
    }
  }
  a=p->num-1;
  if(c[a]==0&&a<=100000)
  {
   c[a]=1;
   x->next=(struct t*)malloc(sizeof(struct t));
   x=x->next;
   x->num=a;
   x->time=p->time+1;
    if(x->num==b)
    {
     printf("%d",x->time);
    return ;
    }
  }
  a=p->num*2;
   if(c[a]==0&&a<=100000)
  {
    c[a]=1;
   x->next=(struct t*)malloc(sizeof(struct t));
   x=x->next;
   x->num=a;
   x->time=p->time+1;
    if(x->num==b)
   {
     printf("%d",x->time);
    return ;
   }
  }
  p1=p;
   if(p->next==NULL)
   {  printf("%d",p->time);
   break;
  }
  p=p->next;
  free(p1);
 }
}

int main()
{
 scanf("%d",&a1);
 scanf("%d",&b);
 if(a1>=b)
 {
  printf("%d",a1-b);
  return 0;
 }
 p1=stack(p1);
 bfs(p1);
 return 0;
}

3 Thoughts on “暑假专题 sdibt11搜索 D Catch That Cow

  1. xdeodetodvmpbujdwqwhinwx

  2. xiaqssakihchlelykjaopqbvrkzlosxhlvqfhntydnyqwxnwumdcfwscnkbrwd

  3. xovaexqrukhcacvnlgjywcqezhafzurnspdnpphfktqvjgxkagff

发表评论

电子邮件地址不会被公开。

Post Navigation