POJ 3087 解题报告--看似简单的不起眼的东西足以WA了
PS:这道题目根本就不是广搜题,又被忽悠了,感觉就是水题中的水题!!
判断为-1的情况是,偷懒了一下,让Count==100000,变输出-1.结果连续提交两次,两次WA晕啊
实在没有办法,只好把这样一种情况给分析了一下,添了几行代码,竟然AC了,看来,逻辑严密很重要啊,这就是科学呀,来不得半点偷懒。
其实有些时候,就应该偷一下懒,编程本来就是为了偷懒的嘛。
但,以后,得记住,如果老是WA,不妨把那些角落里面看似不起眼的东西都翻出来,好好看看,如果不符合逻辑,立马更改。
谨记!
Source Code:
#include <iostream>
using namespace std;
int Count=0;
int len=0;
char S1[100];
char Start[100];
char S2[100];
char T[200];
char Finish[200];
void Union(char * T,char * S1,char *S2)
{//让这两个联合
int i=0;
int i_s1=0;
int i_s2=0;
while(i<=2*len-1)
{
if(i==0)
{
T[i++]=S2[i_s2++];
}
else if(i==1)
{
T[i++]=S1[i_s1++];
}
else if(i%2==0)
{
T[i++]=S2[i_s2++];
}
else
{
T[i++]=S1[i_s1++];
}
}
}
bool IsEqual(char * T,char * Final,int temp=2*len-1)
{
int i=0;
while(i<=temp)
{
if(T[i]!=Final[i])
return false;
i++;
}
return true;
}
void Break(char * T,char * S1,char * S2)//上面是S2,下面是S1
{
int i=0;
while(i<=len-1)
{
S1[i]=T[i];
i++;
}
i=len;
int j=0;
while(i<=2*len-1)
{
S2[j]=T[i];
i++;
j++;
}
}
void Play(int n)
{
for(int i=0;i<len;i++)
{
Start[i]=S1[i];
}
Count=0;
while(1)
{
Union(T,S1,S2);
Count++;
if(IsEqual(T,Finish))
{
printf("%d %d\n",n,Count);
break;
}
Break(T,S1,S2);
// if(Count==100000)
if(IsEqual(S1,Start,len-1))
{
printf("%d -1\n",n);
break;
}
}
}
int main()
{
int n=0;
scanf("%d",&n);
int i=1;
while(i<=n)
{
//Count=0;
memset(Start,0,100*sizeof(char));
memset(S1,0,100*sizeof(char));
memset(S2,0,100*sizeof(char));
memset(Finish,0,200*sizeof(char));
memset(T,0,200*sizeof(char));
cin>>len;
cin>>S1;
cin>>S2;
cin>>Finish;
Play(i++);
}
return 0;
}
呵呵,似乎有点乱。。
回复删除Count==len*len 就可过。
char * shuffle(char *s1, char *s2, char *s12, int c)
{
char *os1 = s1;
char *os2 = s2;
char *os12 = s12;
while(*s2 != '\0'){
*s12++ = *s2++;
*s12++ = *s1++;
}
*s12 = '\0';
strncpy(os1, os12, c);
os1[c] = '\0';
strncpy(os2, os12+c, c);
os2[c] = '\0';
return os12;
}