NYOJ264国王的魔镜(还是看看吧,小学生的题已经这么难了吗。。。)

最优代码写的非常简洁,非常好,用了一个字符串比较函数strcmp,你写的非常复杂,你的解法不能包含每种情况,所有很多细节和特殊情况需要注意,就会把程序复杂化。。。和最优代码显然不是一个水平上的。。。还是好好看看吧

介绍:strcmp函数

C/C++函数,比较两个字符串

设这两个字符串为str1,str2,

若str1==str2,则返回零;

若str1<str2,则返回负数;

若str1>str2,则返回正数。

matlab中函数,strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false

国王的魔镜

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 1
描述
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。

比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。

给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。

输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。
输出
每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
样例输入
2
ABBAABBA
A
样例输出
2
1

最优代码(自己理解):

 
#include<stdio.h>
#include<string.h>
main()
{
	int z,x,q,i;
	char a[101],t[51];
	scanf("%d",&z);
	getchar();
	while(z--)
	{
		gets(a);
		do
		{
			x=strlen(a);
			if(x%2) break;
			for(i=0;i<x/2;i++)
				t[i]=a[x-1-i];
			t[i]='\0';
			a[x/2]='\0';
			q=strcmp(a,t);
		}while(q==0);
		printf("%d\n",x);
	}
}        

你的思想(看不看都行。。。):如果一开始长度为奇数,则肯定没有经过魔镜反射,直接输出即可,这个就是最初长度

如果一开始不是奇数,则把这个项链不停地从中间断开,每断一次比较两边是否对称相等,相等则继续断,知道找到两边不相等的这个情况,乘上2即为初始长度。可是有很多特殊情况不能被其包括,如ABCCBA,初始没有经过反射的长度显然是ABC,可如果按照上述思想,第一次断是ABC | CBA,两边对称,程序还会继续断,可ABC是奇数怎么继续断?所以如果断到两边是奇数且两边相等就直接输出一半的长度即可;还有一种特殊情况AA ,AAAA,AAAAAA这个也按照上面来即可,不停的断,知道两边都是奇数且两边相等,输出1即可(AAA是没有经过反射的情况输出3)

你的代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
    int n,i,d,t,m;
    char a[200];
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        m=1;
        scanf("%s",a);
        t=strlen(a);
        if(t&1)
            printf("%d\n",t);
        else
        for(i=t/2;i>0;i=i/2)
        {
            for(d=0;d<i;d++)
                if(a[i-1-d]!=a[i+d])
                {
                    m=0;
                    break;
                }
            if(m==0)
               {
                   printf("%d\n",2*i);
                   break;
               }
               if(m==1&&i%2!=0)
                {printf("%d\n",i);
                break;}
        }
            }
    return 0;
}

如果用你的方法还有个地方需要注意,对称比较是a[i-d]和a[i+1+d]这样比较,d是距离,要注意的点就是+1

即要区分开3 2 1 a 1 2 3

                3 2 1 a b 1 2 3


猜你喜欢

转载自blog.csdn.net/nanfengzhiwoxin/article/details/80215007