码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 3355 BFS

时间:2015-03-29 16:37:56      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:

给定一条由一个个小方块组成的直线小路,有一只青蛙停在其中的一块小方块上,小方块分黑白两种,分别用字母B和W表示。

青蛙停的位置则由字母F表示。按一定规则操作后,使得在黑方块中没有白方块存在。

规则如下:青蛙共有4种选择,假设还有路的话,可以选择前进一步(即F?变成?F,其中?代表W或B,下同),或后退一步(?F变成F?),

或前进两步(F?B变成W?F),或后退两步(W?F变成F?B)。

问:最少需要几步才能达到预定结果?

青蛙最多只能走10步

BFS即可,用map映射判重


#include "stdio.h"
#include "string.h"
#include "queue"
#include "algorithm"
#include "map"
#include "iostream"
#include "string"
using namespace std;

struct node
{
    string s;
    int step,loc;
};

string str;

int ok(string s)
{
    int len,l,r;
    len=s.size();
    for (l=0;l<len;l++)
        if (s[l]=='B') break;
    for (r=len-1;r>=0;r--)
        if (s[r]=='B') break;

    if (r<=l) return 1;

    for (l;l<=r;l++)
        if (s[l]=='W') return 0;

    return 1;
}

int BFS(string str)
{
    int i,l;
    queue<node>q;
    map<string,int>mark;
    node cur,next;

    cur.s=str;
    cur.step=0;
    if (ok(cur.s)==1) return 0;
    for (i=0;i<str.size();i++)
        if (str[i]=='F')
        {
            cur.loc=i;
            break;
        }

    mark[str]=1;
    q.push(cur);

    while (!q.empty())
    {
        cur=q.front();
        q.pop();
        if (cur.step>=10) continue;

        l=cur.s.size();

        if (cur.loc<l-1)
        {   next=cur;
            swap(next.s[next.loc],next.s[next.loc+1]);
            if (mark[next.s]==0)
            {
                mark[next.s]=1;
                next.step++;
                next.loc++;
                if (ok(next.s)==1) return next.step;
                q.push(next);
            }
        }

        if (cur.loc>0)
        {
            next=cur;
            swap(next.s[next.loc],next.s[next.loc-1]);
            if (mark[next.s]==0)
            {
                mark[next.s]=1;
                next.step++;
                next.loc--;
                if (ok(next.s)==1) return next.step;
                q.push(next);
            }
        }

        if (cur.loc>1)
        {
            next=cur;
            swap(next.s[next.loc],next.s[next.loc-2]);
            if (next.s[next.loc]=='B') next.s[next.loc]='W';
            else next.s[next.loc]='B';

            if (mark[next.s]==0)
            {
                mark[next.s]=1;
                next.step++;
                next.loc-=2;
                if (ok(next.s)==1) return next.step;
                q.push(next);
            }
        }

        if (cur.loc<l-2)
        {
            next=cur;
            swap(next.s[next.loc],next.s[next.loc+2]);
            if (next.s[next.loc]=='B') next.s[next.loc]='W';
            else next.s[next.loc]='B';

            if (mark[next.s]==0)
            {
                mark[next.s]=1;
                next.step++;
                next.loc+=2;
                if (ok(next.s)==1) return next.step;
                q.push(next);
            }
        }
    }
    return -1;
}
int main()
{
    int Case;
    Case=1;
    while (cin>>str)
    {
        if (str[0]=='-') break;

        printf("%d. ",Case++);

        printf("%d\n",BFS(str));

    }
    return 0;
}


HDU 3355 BFS

标签:

原文地址:http://blog.csdn.net/u011932355/article/details/44727523

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!