(续)上次周赛两道题【kmp,bfs】

1692: 选手链

时间限制: 1 Sec  内存限制: 128 MB

题目描述

某天某个人想去买一条手链,但是她比较挑剔,不但想要最美丽的,又想要最长的,手链的颜色可以比较多,但是又不能毫无规律的颜色多而已。她要买的手链必须是颜色够多,还要有规律,什么叫做有规律?就是有循环的。假如给定参照手链“RGB”,再给一个手链比如“RGBRGBRGB”它包含了3个参照手链。此人称包含值为:美丽度。因为包含3个参考串,所以这个手链美丽度就为3.

她想要买一个美丽度大于1的手链,但是又不能只有一种颜色,怎么挑一个最好的呢?这个问题有点难想,现在她向你求助,希望你可以帮助她选择。

输入

有多组测试数据,输入先给出参考手链(参考手链长度大于1),然后输入一个T(0<T<20),代表她选的T组数据。每组数据第一行是参照手链,第二行是这个人想知道美丽度的手链(长度不小于参考手链),因为比较豪,手链的珠子最多可以达到100000。

输出

输出数据也有T行,每行输出,最大美丽度,和相应的手链。如果美丽度相同就输出手链最长的,看下面测试样例。

样例输入

RGB
4
RGBRGB
RGBRGBRGB
RGBWRGBWRGBW
RGRGBRGGRBG

RWW
3
RWWWWR
RWWWWRW
RWRWRW

WWR
5
WWRWW
WWWRWWRWR
WWWWWWWW
WRWRWRWR
WRRWRWRWWW

样例输出

3 RGBWRGBWRGBW
1 RWWWWRW
2 WWWRWWRWR

上次周练的一道题,考察的 kmp 算法,虽然很快就敲出来并提交了,但是一直wa,费尽心思找了很久,也没发现问题所在,也就没整理,今天算是知道问题出在哪了,也算是解决了问题了
自己的算法和思路一点都没错,错就错在自己的条件判断错了,本以为能行使相应的功能,却没想到因为自己的一时大意,断送了整个题,明明会做的题,非要等到最后发现是小地方出错后,让自己懊悔,这样真的很不应该,细节决定成败,不能太粗心,否则只能一事无成..



#include<cstdio> 
#include<cstring> 
#define maxn 10005
int lenx,p[maxn*100],cnt; 
char x[maxn*100]; 
struct xuandx 
{ 
    char s[maxn*100]; 
    int x; //美丽度
    int len; //长度
}y[25]; 
void getp() //求出 p 数组
{ 
    int i=0,j=-1; 
    p[i]=j; 
    while(i<lenx) 
    { 
        if(j==-1||x[i]==x[j]) 
        { 
            ++j;++i; 
            p[i]=j; 
        } 
        else
        { 
            j=p[j]; 
        } 
    } 
} 
int kmp(char s[]) 
{
    int i=0,j=0; 
    int leny=strlen(s); 
    while(i<leny) 
    { 
        if(j==-1||x[j]==s[i]) 
        {
            ++i,++j; 
            if(j==lenx) 
            { 
                ++cnt; //统计的就是美丽度
                j=0; //因为不能重复计算
            } 
        }
        else
        {
            j=p[j]; 
        }
    } 
    return cnt; 
}
  
int main() 
{ 
    int t,i,k; 
    while(scanf("%s",x)!=EOF) 
    {
        lenx=strlen(x); 
        getp();
        scanf("%d",&t); 
        getchar(); 
        for(i=0;i<t;++i) 
        {
            scanf("%s",y[i].s);
            y[i].len=strlen(y[i].s); 
        }
        k=0; 
        for(i=0;i<t;++i) //这个循环查找标记最优的数据
        {
            cnt=0; 
            y[i].x=kmp(y[i].s); 
            if(y[i].x>y[k].x||(y[i].x==y[k].x&&y[i].len>y[k].len)) //就是这里错了,才导致一直出问题,谨记
            {
                k=i; 
            }
        }
        printf("%d %s\n",y[k].x,y[k].s); //输出最优解
    } 
    return 0; 
}


1694: 打败魔王

时间限制: 2 Sec   内存限制: 128 MB

题目描述

可怜的公主又被魔王抓走了。魔王这次准备在T时刻与公主成亲,不过公主深信智勇的骑士肯定能将她救出。
已知:

公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用 . 表示。
骑士一进入时空传输机就会被转到另一层的相对位置(没有选择的余地),但如果被转到的位置是墙的话,那就会game over....

骑士在一层中只能前后左右移动,每移动一格花一个单位时间。层间的移动只能通过时空传输机(两个传输机不会在同一个位置的两层出现),且不需要任何时间。

输入

输入有多组测试数据。
每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。
接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

输出

如果骑士能够在T时刻能找到(找到就可以)公主就输出“YES”,否则输出“NO”。

样例输入

1 4 2
.#.#

*.#P

样例输出

NO

这个题是简单的 bfs 但是自己在赛场上没做出来,原因不是自己不会做,而是前面的题目把所有的时间都浪费掉了,这个题已经没余地来做了...以后做题,遇到难题千万别钻牛角尖,可能后面的题目比前面的还要简单,固执害的只能是自己,倒不如让步一下,记住让步不是放弃,而是为了更好的前进


#include<stdio.h> 
#include<string.h> 
#include<queue> 
using namespace std; 
int v[2][15][15],n,m,t,kase; 
int fy[4]={-1,0,0,1},fz[4]={0,-1,1,0}; 
char x[2][15][15]; 
struct mg 
{ 
    int x,y,z; 
    int t; 
}site,temp; 
  
void bfs() 
{ 
    queue<mg> q;  
    site.x=site.y=site.z=site.t=0; 
    q.push(site);//v[0][0][0]=1; 
    while(!q.empty()) 
    { 
        site=q.front();q.pop(); 
        if(site.t>t) 
        { 
            continue; 
        } 
        if(x[site.x][site.y][site.z]=='P') 
        { 
            kase=1; 
            return; 
        } 
        for(int i=0;i<4;++i) 
        { 
            int tx=site.x,ty=site.y+fy[i],tz=site.z+fz[i]; 
            if(ty<0||ty>n-1||tz<0||tz>m-1) 
            { 
                continue; 
            } 
            if(x[tx][ty][tz]=='#') 
            { 
                tx=(tx+1)%2; 
            } 
            if(!v[tx][ty][tz]&&x[tx][ty][tz]!='*') 
            { 
                temp.x=tx;temp.y=ty; 
                temp.z=tz;temp.t=site.t+1; 
                q.push(temp); 
                v[tx][ty][tz]=1; 
            } 
        } 
    } 
} 
int main() 
{ 
    int i,j,k; 
    while(scanf("%d%d%d",&n,&m,&t)!=EOF) 
    { 
        for(i=0;i<2;++i) 
        { 
            getchar(); 
            for(j=0;j<n;++j) 
            { 
                scanf("%s",x[i][j]); 
            } 
        } 
        memset(v,0,sizeof(v)); 
        kase=0;bfs(); 
        if(kase) 
        { 
            printf("YES\n"); 
            continue; 
        } 
        printf("NO\n"); 
    } 
    return 0; 
} 


上次比赛算是给自己留下了比较深刻的记忆,因为自己多方面的原因,导致成绩很不理想,反思下来,主要有几点:

第一:知识,考察的内容掌握的不扎实,有时候按自己的理解,很可能会出问题,学习还是要虚心点,不能好高骛远,一步一步踏实点才是王道,

第二:粗心,至少有三道题,因为马虎,细节一直出问题,导致了无法弥补的后果,怪自己不够耐心,要是冷静思考问题,不应该出这么多细节错误,

第三:心态,在比赛中,不仅考察自己对知识的掌握程度,还是考察了一个人的全面素质,比如临场应变能力等,因为一个题的细节错误卡住了接近两个小时,不但严重影响了比赛的时间,还破坏了自己的心情,造成后面的题都没心思做了,这样很不好,自己还是不够沉稳,需要慢慢的改变


反思归反思,路还是要走的,一次小的挫折,永远不能阻挡追寻梦想的脚步,一次痛的教训,也许就是下一次成功的积淀,永远不会放弃,相信自己的努力!



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值