poj3087
题目链接:
https://vjudge.net/problem/POJ-3087
题目类型:暴力模拟+字符串
- 字符串的题最好还是用string,比char数组方便很多
- sacnf读入字符会读入回车,需要用getchar()消除
- 多个用例的情况下注意清空
提交记录
- 第一次CE,因为poj不支持c++11所以不能使用哈希表
- 第一次WA,加了一个清空字符数组e的语句
- 第二次WA,修改了第47行的memcpy,对于memcpy函数第三个参数是要复制过去的字节大小,要复制4个int就填4*sizeof(int),当然由于char的大小是1所以直接填大小也行。在这里为什么sizeof(s2)不对呢,因为s2的大小不仅仅是这一次使用的,他早就被扩充了
c++代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;
const int maxn = 210;
char s1[maxn],s2[maxn],e[maxn];
set<string> st;
int res;
int T,n;
bool shuffle(char *s1,char*s2)
{
char temp[maxn];
for (int i=0;i<n*2;i++)
{
int j = i/2;
if (i%2 == 0)
{
//s2
temp[i] = s2[j];
}
else{
//s1
temp[i] = s1[j];
}
}
temp[2*n] = '\0';
res++;
bool iseuq = true;
for (int i=0;i<n*2;i++)
{
if (temp[i]!=e[i]) iseuq = false;
}
if(!iseuq)
{
string str = temp;
if(st.count(str))
{
res = -1;
return false;
}
else{
st.insert(str);
memcpy(s1,temp,n);
memcpy(s2,temp+n,n*sizeof(char));
return true;
}
}
else{
return false;
}
}
int main()
{
scanf("%d",&T);
for (int j=1;j<=T;j++)
{
res = 0;
st.clear();
scanf("%d\n",&n);
memset(s1,0,sizeof s1);
memset(s2,0,sizeof s2);
memset(e,0,sizeof e);
for (int i=0;i<n;i++) scanf("%c",&s1[i]);
getchar();
for (int i=0;i<n;i++) scanf("%c",&s2[i]);
getchar();
for (int i=0;i<2*n;i++) scanf("%c",&e[i]);
getchar();
while(shuffle(s1,s2)) {}
printf("%d %d\n",j,res);
}
return 0;
}