hdu 1195 广度搜索

这题我们可以用优先队列,每次弹出队列中操作次数最少的一个,那么当找到匹配数时,该值一定是最优的。需要注意的时,加个vi[]数组,判读当前数是否已经存在于队列中。我做的很烦啊~~~

#include<iostream>

#include<cstdio>

#include<queue>

#include<algorithm>

#include<cmath>

#include<vector>

using namespace std;

int n,m;

int vi[100000];

struct Point{

    int n,num;

    Point(int x,int y)

    {

        vi[x]=1;

        n=x;

        num=y;

    }

    int operator <(const Point &temp) const

    {

        return num>temp.num;

    }

}p(0,0);

priority_queue<Point> q;

int bfs()

{

    if(n==m)

        return 0;

    while(!q.empty())

        q.pop();

    memset(vi,0,sizeof(vi));

    p.n=n,p.num=0;

    q.push(p);

    int a,b,c,d;

    while(!q.empty())

    {

        p=q.top();

        q.pop();

        if(p.n==m)

            return p.num;

        //cout<<p.n<<"  "<<p.num<<endl;

        a=p.n/1000;

        b=(p.n/100)%10;

        c=(p.n%100)/10;

        d=p.n%10;

        //cout<<p.n<<endl;

        //cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;

        if(a==9)

        {

            if(!vi[1000+b*100+c*10+d])

        q.push(Point(1000+b*100+c*10+d,p.num+1));

        }

        else

            if(!vi[p.n+1000])

        q.push(Point(p.n+1000,p.num+1));

        if(b==9)

        {

            if(!vi[a*1000+100+c*10+d])

        q.push(Point(a*1000+100+c*10+d,p.num+1));

        }

        else

            if(!vi[p.n+100])

        q.push(Point(p.n+100,p.num+1));

        if(c==9)

        {

            if(!vi[a*1000+b*100+10+d])

        q.push(Point(a*1000+b*100+10+d,p.num+1));

        }

        else

            if(!vi[p.n+10])

        q.push(Point(p.n+10,p.num+1));

        if(d==9)

        {

            if(!vi[a*1000+b*100+c*10+1])

        q.push(Point(a*1000+b*100+c*10+1,p.num+1));

        }

        else

            if(!vi[p.n+1])

        q.push(Point(p.n+1,p.num+1));

        if(a==1)

        {

            if(!vi[9000+b*100+c*10+d])

        q.push(Point(9000+b*100+c*10+d,p.num+1));

        }

        else

            if(!vi[p.n-1000])

        q.push(Point(p.n-1000,p.num+1));

        if(b==1)

        {

            if(!vi[a*1000+900+c*10+d])

        q.push(Point(a*1000+900+c*10+d,p.num+1));

        }

        else

            if(!vi[p.n-100])

        q.push(Point(p.n-100,p.num+1));

        if(c==1)

        {

            if(!vi[a*1000+b*100+90+d])

        q.push(Point(a*1000+b*100+90+d,p.num+1));

        }

        else

            if(!vi[p.n-10])

        q.push(Point(p.n-10,p.num+1));

        if(d==1)

        {

            if(!vi[a*1000+b*100+c*10+9])

        q.push(Point(a*1000+b*100+c*10+9,p.num+1));

        }

        else

            if(!vi[p.n-1])

        q.push(Point(p.n-1,p.num+1));

            if(!vi[b*1000+a*100+c*10+d])

        q.push(Point(b*1000+a*100+c*10+d,p.num+1));

            if(!vi[a*1000+c*100+b*10+d])

        q.push(Point(a*1000+c*100+b*10+d,p.num+1));

            if(!vi[a*1000+b*100+d*10+c])

        q.push(Point(a*1000+b*100+d*10+c,p.num+1));

    }

}

int main()

{

    int t,i,j;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%d%d",&n,&m);

        printf("%d\n",bfs());

    }

    return 0;

}

 

你可能感兴趣的:(HDU)