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");
    }
}

 

   

时间: 2024-10-21 21:22:54

uva 310 - L--system bfs的相关文章

算法题:UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))

Pebble solitaire is an interesting game. This is a game where you are given a board with an arrangement of small cavities, initially all but one occupied by a pebble each. The aim of the game is to remove as many pebbles as possible from the board. P

java system类使用方法示例 获取系统信息_java

常用的方法: 复制代码 代码如下:  long currentTimeMillis();  获取当前时间的毫秒值 void exit();终止当前正在运行的 Java 虚拟机.  复制代码 代码如下:  public static void Method(){     long l = System.currentTimeMillis();     System.out.println(l);      System.exit(); } 描述系统属性信息:Properties System.ge

uva 10047 - The Monocycle

点击打开链接uva 10047 思路:bfs 分析: 1 题目给定一个起始的状态然后要求是否可以到达目标状态 2 这些状态包括了位置,方向,底面颜色.所以我们在每一个结点里面保存的是当前结点的位置和方向和底面的颜色,然后进行搜索 3 到达某一个格子后,我们会有三种选择前进,向左,向右,所以我们只需要去把所有符合条件的状态加入队列即可 代码: #include<queue> #include<cstdio> #include<cstring> #include<io

【BBED】 SYSTEM文件头损坏的恢复(4)

[BBED] SYSTEM文件头损坏的恢复   1.1  BLOG文档结构图     1.2  前言部分   1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① BBED恢复SYSTEM文件头 ② BBED查看文件头的信息     Tips:        ① 若文章代码格式有错乱,推荐使用QQ.搜狗或360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://yunpan.cn/cd

DOS下使用注册表完全手册

1.导出注册表 格式:regedit /l:system /R:user /e filehttp://www.aliyun.com/zixun/aggregation/11696.html">name.reg regpath 含义:/l system 指定system.dat文件的路径 :/R user 指定user.dat文件的路径 :/E filename.reg指定表编辑器要进行导出到那个REG文件中的操作 Regpath:指定要导出哪个注册表的分支,若省略则表示导出整个注册表 2.

最详细的SQL注入相关的命令整理

sql 1.   用^转义字符来写ASP(一句话木马)文件的方法:   http://192.168.1.5/display.asp?keyno=1881;exec master.dbo.xp_cmdshell 'echo ^<script language=VBScript runat=server^>execute request^("l"^)^</script^> >c:\mu.asp';--    echo ^<%execute^(req

java 实现web 登陆

web web登陆无非就是网页获取,cookie 的管理,post和get方式的模拟. 1.网页内容获取 java.io.InputStream in; java.net.URL url = new java.net.URL(www.xyz.com/content.html); java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection(); connection = (java.

C# 文件拆分器

组合时采用了两层的COPY命令,可多组合一些文件,其实用测试命令行总长度的办法可以理论上实现无限拆分文件的组合,但实用价值就不高了,拆成万余份文件不但此单线程方法显得效率低下,而且应当用更优秀算法进行分割和组合. 这个程序最终只能归为"玩具"一类. using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using

基于.Net Framework的N层分布式应用开发

分布式 主题:建立可维护.可扩展的站点,开发高效率.高伸缩性的应用程序.创建N层分布式应用程序.实现跨平台.跨Internet的应用集成,是摆在无数开发者面前的任务.传统开发方式及技术面临了困难. .Net Framework推出的许多新技术为上述任务的实现提供了相对简单的解决方案.其中,基于SOAP的Web Service在处理分布式应用时具有比传统的DCOM/CORBA明显的优点,结合基于Web的ASP.NET页面开发技术和SQL Server数据存储技术(或Xml文档),在.Net下开发N