HDU 3355 BFS

给定一条由一个个小方块组成的直线小路,有一只青蛙停在其中的一块小方块上,小方块分黑白两种,分别用字母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;
}
时间: 2024-08-26 03:34:27

HDU 3355 BFS的相关文章

hdu 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 和之前的1728类似.就是判断转弯数,建立一个用于记录转弯数的数组.. 还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO.还有就是起点或终点是零这也是不行的,因为0代表没有棋子... 还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写.. 错误的地方都写在注释中了.. 代码: // hdu 1175 bfs 转弯数 //1.起点

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

HDU 1072 bfs

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7083    Accepted Submission(s): 3409 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a tim

hdu 1252 BFS

1 /* 2 题意:给出一个m*m矩阵表示的完全图,且每个点都有自环,每条边都有一种颜色:有三个玩家ABC的三张纸片分别初始在 3 某三个位置(可以重叠),纸片可以沿着边走一步,可以走的路径的规则为:若A要走到某个点i,则A-i的颜色要和B-C的颜 4 色相同:问最少要走多少步.(题意太难懂了,看了别人的说明才弄懂了题意) 5 6 题解:BFS 7 首先初步分析题意似乎很难用图论来解决,那么就是搜索/DP/数据结构,然后从搜索方面去思考的话,就是要找状态,然 8 后初步列出所有信息,三个点得位置

hdu 4707 bfs

bfs基础算法水题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<queue> using namespace std; const int Max = 1e5+50; int dist[Max]; vector<int> t

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

hdu 1226 BFS + bfs记录路径

http://acm.hdu.edu.cn/showproblem.php?pid=1226 为了省空间,可以用vis数组初始化的时候初始化为-1, 发现一个BFS容易错的地方 开始一直WA在这里:就是我int tp=q.front();之后马上q.pop():了,然后才去判断是不是符合条件以break,这样就不能根据q.empty()==1认为没有找到ans 因为这里WA了 其实也可以vis[0] == -1来判断 比较不理解的是 当n==0的时候 %n==0的时候怎么处理 //#pragma

hdu 5025 BFS + 优化 广东区域赛网赛

http://acm.hdu.edu.cn/showproblem.php?pid=5025 TLE了好几次 写的时候,问题在于, 1.钥匙怎么处理 参考了他人的写法,vis[key_num][i][j],相当于将图多维化,这样就可以判重了,否则只是按照普通的BFS,钥匙数不同的时候,可以重复,这个代码难易表达出来 另外此处一个很好的优化,当cost_now<cost[key_now][x_now][y_now]的时候,才q.push(Node)  这个剪枝很好啊 2.蛇怎么处理 没蛇的话,第一

hdu 1430 (BFS 康托展开 或 map )

第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个wa算了. 然后卡着了,后来上网上搜了,要用康托展开,康托展开是什么鬼?然后学习了一下,就是个映射,感觉和map差不多. http://blog.csdn.net/zhongkeli/article/details/6966805这个学习一下康托展开. 其实本题的关键不是康托展开,而是置换. 以12