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

1692: 选手链

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

题目描述

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

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

输入

有多组测试数据,输入先给出参考手链(参考手链长度大于1),然后输入一个T(0

输出

输出数据也有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 
#include 
#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(iy[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 
#include 
#include 
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 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


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

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

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

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


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



你可能感兴趣的:((续)上次周赛两道题【kmp,bfs】)