Aizu 1296 简单bfs

题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1296

题意: 给出一些个替换模式, 问将原始串通过替换得到目标串所需要的最小的替换次数是多少。

思路:由于数据规模很小(n<=10),并且每次替换的时候都将都将所有能替换的都替换,并且再有多种位置可发生替换的时候,优先替换最左边的串,这些个条件使得题目的不确定度大大的降低,直接使用bfs搜索就好。

通过这道题,熟悉一下string还有map的使用还是很不错的。

code:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <queue>
#include <string>
using namespace std;

map<string,int> pam;
queue<string> que;
int n;
string s0[20],s1[20];
string org,aim;

int bfs()
{
    pam.clear();
    pam[org]=0;
    que.push(org);
    while(que.size()){
        string v=que.front(); que.pop();
        if(v.length()>aim.length()) continue;
        for(int i=0;i<n;i++){
            int l1=s0[i].length(),l2=v.length();
            string u="";
            for(int j=0;j<l2;j++){
                if(j+l1-1<l2&&v.substr(j,l1)==s0[i]){
                    u+=s1[i];
                    j=j+l1-1;
                }
                else u+=v[j];
            }
            //cout<<"org="<<v<<" t0="<<s0[i]<<" t1="<<s1[i]<<" res="<<u<<endl;
            if(!pam.count(u)||pam[u]>pam[v]+1){
                pam[u]=pam[v]+1;
                que.push(u);
            }
        }
    }
    if(!pam.count(aim)) return -1;
    else return pam[aim];
}

int main()
{
    while(cin>>n,n!=0){
        for(int i=0;i<n;i++) cin>>s0[i]>>s1[i];
        cin>>org;
        cin>>aim;
        cout<<bfs()<<endl;
    }
    return 0;
}
时间: 2024-10-07 17:14:24

Aizu 1296 简单bfs的相关文章

POJ 3278 Catch That Cow --- 简单BFS

/* POJ 3278 Catch That Cow --- 简单BFS */ #include <cstdio> #include <queue> #include <cstring> using namespace std; const int maxn = 100005; bool visit[maxn]; int step[maxn]; int bfs(int n, int k){ if (n == k) return 0; memset(visit, 0, s

【POJ 3669 Meteor Shower】简单BFS

流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封锁).安全地带为永远不会被封锁的点. 简单bfs,开始WA在把平面空间上限当成300*300,但根据题目,这只是有流星雨撞击的范围.实际可走的空间理论上没上限,但分析可得,离原点最近的安全地带一定在(302,302)范围内,所以应可把数组至少开为303*303. 后来WA在把G[0][0]==1的情

LightOJ 1012 简单bfs,水

1.LightOJ 1012  Guilty Prince  简单bfs 2.总结:水 题意:迷宫,求有多少位置可去 #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define F(i,a,b) for (int i=a;i<=b;i++) using names

HDU 1548 A strange lift(Dijkstra,简单BFS)

题目大意: 电梯有两个选项向上或向下,每层楼有一个参数ki,代表电梯可以再该楼层的基础上向上或向下移动ki层,限制条件是向上不能超过楼层总数n,向下不能少于一.输入总层数n和当前所在层数以及目标层数,然后是n个数分别代表第i层的移动范围.输出最少移动次数,若不可达,输出-1. 解题思路: 1.用Dijkstra算法,首先构建邻接矩阵,注意在构造时,要考虑i-k[i]<1和i+k[i]>n,i代表当前所在层. 1 #include<string.h> 2 #include<st

poj 1562 简单 bfs

// 简单 bfs #include <iostream>#include<fstream>using namespace std; char map[110][110];int flag[110][110];int qu[11000][2],qe,qs,m,n;int add[8][2]={-1,-1,  -1,0, -1,1,   0,-1,  0,1,  1,-1,    1,0,   1,1 }; void bfs(int r,int c){    int i,tr,tc;

POJ3185(简单BFS,主要做测试使用)

没事做水了一道POJ的简单BFS的题目 这道题的数据范围是20,所以状态总数就是(1<<20) 第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实这里我是很不明白的,,TM状态总数就只有1e6怎么也不应该超时的,,,,只能说STL的queue的常数实在是太大,完全没法弄...) 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <qu

逃脱 (简单BFS)

题目传送门 G逃脱  题目描述 这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的mengxiang000和Tabris听到了火灾警报声的同时拔腿就跑,不知道两人是否能够逃脱险境? 幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素: “.”:表示这是一块空地,是可以随意穿梭的. “#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁. “S”:表示men

POJ 1753 Flip Game 简单BFS

很简单的搜索题目,随便写. 题目链接 1 #include <stdio.h> 2 #include <string.h> 3 int st; 4 char s[10]; 5 int q[70000],vis[70000],front,tail; 6 const int dx[]={1,-1,0,0}; 7 const int dy[]={0,0,1,-1}; 8 int BFS() { 9 front=tail=0; 10 memset(vis,-1,sizeof(vis));

POJ - 2251 - Dungeon Master (简单BFS)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20450   Accepted: 7917 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled