uva 310 - L--system bfs

简介:

310 - L--system

 

     一个知识性题目,介绍了一个L系统,L系统有个递归变换规则,就是可以把其中所有的字母,按照规则替换成对应的字符串,具体的可以维基一下。

 

     这题是给了两个规则,要求两种规则同时作用,问能不能能个创造一个字符串包含目标串,主要要注意的就是如果初始串就包含目标串,则要截取判断,和对于状态长度的最大限度。

 

     只要搞清楚了规则,那么直接bfs即可

 

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <map>
#define INF 1E9
using namespace std;
char A[20],B[20],w[20];
int la,lw;
string aim,now,temp;
map<string,int> vis;
queue<string> q;
bool flag;
void change(string s)
{
    int i,len=s.size();
    now="";
    for(i=0;i<len;i++)
    {
        switch(s[i])
        {
            case 'a':now+=A;break;
            case 'b':now+=B;break;
        }
    }
    if(now.size()<=la)
    {
        if(vis[now])return;
        if(aim==now)flag=0;
        vis[now]=1;q.push(now);
    }
    else//超出长度,截取
    {
        len=now.size()-la;
        for(i=0;i<=len;i++)
        {
            temp=now.substr(i,la);
            if(vis[temp])continue;
            if(temp==aim)flag=0;
            vis[temp]=1;q.push(temp);
        }
    }
    return;
}
int main()
{
    int i,j;
    char t;
    while(~scanf("%s%s%s",A,B,w))
    {
        flag=1;
        cin>>aim;
        la=aim.size();lw=strlen(w);
        vis.clear();
        while(!q.empty())q.pop();
        for(i=0;i<lw&&flag;i++)//截取原字符串
          for(j=i+1;j<=lw&&flag;j++)
          {
              t=w[j];
              w[j]='\0';
              temp=string(w+i);
              w[j]=t;
              if(vis[temp])continue;
              if(temp==aim)flag=0;
              vis[temp]=1;
              q.push(temp);
         }
        while(!q.empty()&&flag)
        {
            change(q.front());
            q.pop();
        }
        printf("%s\n",flag?"NO":"YES");
    }
}


 

   

目录
相关文章
|
存储 容器
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
168 0
|
机器学习/深度学习 测试技术
UVA11175 有向图D和E From D to E and Back
UVA11175 有向图D和E From D to E and Back
UVA11175 有向图D和E From D to E and Back
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 234. 回文链表 Palindrome Linked List
codeforces1244——D.Paint the Tree(dfs)
codeforces1244——D.Paint the Tree(dfs)
90 0
Biggest Number深搜
You can start from any square, walk in the maze, and finally stop at some square. Each step, you may only walk into one of the four neighbouring squares (up, down, left, right) and you cannot walk into obstacles or walk into a square more than once.
120 0
Biggest Number深搜
|
Java Python
LeetCode 234:回文链表 Palindrome Linked List
​请判断一个链表是否为回文链表。 Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? Follow up:Could you do it in O(n) time and O(1) space? 解题思路: 首先是寻找链表中间节点,这个可以用快慢指针来解决,快指针速度为2,慢指针速度为1,快指针遍历完链表时,慢指针刚好走到中间节点(相对)。
697 0
|
并行计算
Find a way(两个BFS)
Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally.
1114 0