http://poj.org/problem?id=3087
题意 : 我只能说,,英语不好是硬伤。。。这个题比较别扭啊,不知道真正题意是不是我所想的,我先把我A了的代码按照的题意的意思说一下,就是说两堆字符串每堆n个字符,从下边开始轮流取,其实输入之后就是从头开始取,先取第二个字符串的,放在最底下,再取第一个的,直到合成一个新的,然后再把下边n个取出来当成第一个字符串,上边n个当成第二个字符串,继续进行上述操作,直到新合成的字符串与题目中给出的目标字符串相同,若是合不成就输出-1,每次输出先输出是第几组数据,再输出需要几次可以达到目标字符串
思路 : 模拟?还行吧,挺简单的,用map函数标记一下就行,若是新合成的与之前某个合成的一样的,代表着这一组会陷入无限循环中,所以直接输出-1就行了
#include<cstdio>
#include
<iostream>
#include
<map>
#include
<cstring>
using
namespace
std ;
const
int
maxn =
1010
;
int
main()
{
int
n ;
cin
>>
n ;
char
ch[maxn],sh[maxn],sch[maxn],neww[maxn] ;
for
(
int
i =
1
; i <= n ; i++
)
{
map
<
string
,
int
>
p ;
int
m ,cnt =
0
,sum =
0
;
cin
>>
m ;
cin
>>ch>>sh>>
sch ;
cout
<<i<<
'
'
;
while
(
1
)
{
cnt
=
0
;
for
(
int
j =
0
; j < m ; j++
)
{
neww[cnt
++] =
sh[j] ;
neww[cnt
++] =
ch[j] ;
}
neww[
2
*m] =
'
\0
'
;
sum
++
;
if
(strcmp(neww,sch) ==
0
)
{
cout
<<sum<<
endl;
break
;
}
if
(p[neww])
{
cout
<<
"
-1
"
<<
endl;
break
;
}
p[neww]
++
;
strncpy(ch,neww,m);
ch[m]
=
'
\0
'
;
strcpy(sh,neww
+
m);
}
}
}

