poj 3087(一道简单的模拟)

http://poj.org/problem?id=3087
题目是一个很明显的模拟,两个等长字符串交错合并,并更新两个字符串为合并后字符串的前后两个部分,求合并成给定字符串的最少次数。

模拟合并的过程就可以了,唯一需要注意的就是如果不能合成指定字符串会形成一个循环。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e3 + 7;
typedef long long ll;
char s1[N],s2[N],s[N],s12[N],sa[N];
int ans = 0,n,m;
void operate() // 模拟操作
{
    for(int i = 0;i < n;++i){
        s[2 * i] = s2[i];
        s[2 * i + 1] = s1[i];
    }
    for(int i = 0;i < n;++i){
        s1[i] = s[i];
        s2[i] = s[n + i];
    }
}
bool add(char s1[],char s2[],char s12[]) // 判断不需要合成的情况
{
    for(int i = 0;i < n;++i){
        if(s1[i] != s12[i]) return false;
        if(s2[i] != s12[i + n]) return false;
    }
    return true;
}
bool cmp(char a[],char b[]) // 比较两个字符串的函数,不知道为什么用strcmp会有问题
{
    for(int i = 0;i < 2 * n;++i)
        if(a[i] != b[i]) return false;
    return true;
}

int main ()
{
    int t,m = 0;
    cin >> t;
    while(t--){
        m++;
        cin >> n >> s1 >> s2 >> s12;
        for(int i = 0;i < n;++i){
            sa[2 * i] = s2[i];
            sa[2 * i + 1] = s1[i];
        }
        if(add(s1,s2,s12)) ans = 0; // 不需要变化的情况
        else{
            operate(); // 先操作一次,使搜索的时候跳过第一次变化,用于测试出不能合成的情况
            ans++;
            while(!cmp(s,s12)){
                operate();
                ans++;
                if(cmp(s,sa)){
                    ans = -1;
                    break;
                }
            }
        }
        cout << m << ' ' << ans << endl;
        ans = 0; // 由于多组数据,记得初始化ans
    }
    return 0;
}
这一题因为比较函数的问题,居然debug了一个小时,搞得我都开始怀疑人生了。。。明明是一个水题的说。。。

猜你喜欢

转载自blog.csdn.net/qq_41791981/article/details/80517983