POJ3578-Catch That Cow

 题解:题意简单,看见最少直接用bfs。三个状态,然后就是要减枝了,首先如果当前的数大于m的值就只用-就可以了,当然不能为0。

#include<stdio.h>
#include<string.h>
using namespace std;

struct node
{
    int x;
    int cost;
};
short vis[200050];
struct node que[200050];
int main()
{
    int n,m;
    int head,fail;
    int i,j;
    int ans=0;

    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==m){
            printf("0\n");
            continue;
        }
        memset(vis,0,sizeof(vis));
        ans=0;
        head=0;
        fail=1;

        que[0].x=n;
        que[0].cost=0;

        while(fail<200050)
        {
            if(que[head].x<m&&vis[que[head].x+1]==0)
            {
                vis[que[head].x+1]=1;
                que[fail].x=que[head].x+1;
                que[fail].cost=que[head].cost+1;
                if(que[fail].x==m)
                {
                    ans=que[fail].cost;
                    break;
                }
                fail++;
            }


            if(que[head].x-1>=0&&vis[que[head].x-1]==0)
            {
                vis[que[head].x-1]=1;
                que[fail].x=que[head].x-1;

                que[fail].cost=que[head].cost+1;
                if(que[fail].x==m)
                {
                    ans=que[fail].cost;
                    break;
                }
                fail++;
            }
            if(que[head].x<m&&vis[que[head].x*2]==0)
            {
                vis[que[head].x*2]=1;
                que[fail].x=que[head].x*2;
                que[fail].cost=que[head].cost+1;
                if(que[fail].x==m)
                {
                    ans=que[fail].cost;
                    break;
                }
                fail++;
            }
            head++;
        }
        printf("%d\n",ans);
    }
}

 

рекомендация

отblog.csdn.net/xxf_is_girl_gad/article/details/90416184