poj3278-兩年後的重寫

哎,今天一看以前寫的,真是不忍直視~擔心以前被我毒害到的青年,我自己現在都被自己毒到了~~,於是先簡單重寫一波,晚上查查看有沒有什麼更加優化的地方,現在先還一波債;

用的是BFS,代碼裏有簡單的優化:用isVisited來記錄已經訪問過的點,以及當前位置大於牛的位置的話,只剩下-1的方案能選。我數組開的挺大的,基本上是兩倍的,是爲了防止K接近100000的時候,內存爆了。直接用了兩個queue,也可以用pair簡化一點代碼~

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;

const int maxn=2*1e5+5;
bool isVisited[maxn];

int N,K;
int bfs()
{
    if(K<=N)
        return N-K;
    int t;

    queue<int> q,times;
    q.push(N);
    times.push(0);
    isVisited[N]=true;
    while(!q.empty())
    {
        int fa=q.front();
        t=times.front();
        t++;
        q.pop();
        times.pop();
        if(fa*2==K||fa+1==K||fa-1==K)
            break;
        else{
            if(fa<K){
                if(fa*2<maxn&&!isVisited[fa*2])
                {
                    q.push(fa*2);
                    times.push(t);
                    isVisited[fa*2]=true;
                }
                if(fa+1<maxn&&!isVisited[fa+1])
                {
                    q.push(fa+1);
                    times.push(t);
                    isVisited[fa+1]=true;
                }
            }
            if(fa-1>=0&&!isVisited[fa-1])
            {
                q.push(fa-1);
                times.push(t);
                isVisited[fa-1]=true;
            }
        }
    }
    return t;
}

int main()
{
    while(~scanf("%d%d",&N,&K))
    {
        memset(isVisited,false,sizeof(isVisited));
        printf("%d\n",bfs());
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章