poj3087 Shuffle'm Up ——水题

April 19, 2013
POJ

题目链接:http://poj.org/problem?id=3087 题目大意:   给定长度都为C两个字符串,S1,S2,和一个要求的结果字符串SS。先把S2的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到S,再把S最下面的C个字符赋值给S1,把剩下的赋值给S2,再次重复上面的过程。最后求出要得到SS,需要几步这样的过程。 题目思路:   开始以为是用STL的栈,后来才发现根本用不到,直接用字符串模拟就可以了。为了学习一下STL,用的是string类。只要比较当前得到的字符串和要得到的字符串是不是相等就可以了。如果永远也得不到要得到的字符串,那么就一定存在S1和S2和原来的S1和S2都对应相等,其实这道题目的难点就在这里。


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <algorithm>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
typedef long long int LL;
const int MAXN =  0x3f3f3f3f;
const int  MIN =  -0x3f3f3f3f;
const double eps = 1e-9;
const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1},
  {1,1},{1,-1},{-1,-1}};

int main(void){
#ifndef ONLINE_JUDGE
  freopen("3087.in", "r", stdin);
#endif
  int n, i, c, j; scanf("%d", &n);
  string s1, s2, s, S1, S2, S;
  for (i = 1; i <= n; ++i){
    printf("%d ", i);
    cin >> c >> s1 >> s2 >> S; int cnt = 0;
    S1 = s1; S2 = s2;
    string::iterator it; bool flag = false;
    s = "";
    while (1){
      for (j = 0; j < c; ++j){
        s += s2[j]; s+= s1[j];
      } s1 = s2 = ""; cnt++;
      if (!s.compare(S)) {flag = true; printf("%d\n", cnt);break;}
      for (j = 0; j < c; ++j){
        s1+=s[j]; 
      }
      for (j = c; j < s.length(); ++j){ s2+= s[j];}
      s = "";
      if (!s1.compare(S1) && !s2.compare(S2)) break;
    }
    if (!flag) printf("-1\n");
  }

  return 0;
}

看了人家的代码,http://blog.sina.com.cn/s/blog_6a0e04380100olz1.html,用到了set,正好这道题目不难,正好学习一下set类,所以也照着学了一下。 但是有一个地方的思路有一点儿差别,就是,它判别是不是永远也得不到SS的时候用的是S是不是出现过,其实本质上和我的是一样的。


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <algorithm>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
typedef long long int LL;
const int MAXN =  0x3f3f3f3f;
const int  MIN =  -0x3f3f3f3f;
const double eps = 1e-9;
const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1},
  {1,1},{1,-1},{-1,-1}};

int main(void){
#ifndef ONLINE_JUDGE
  freopen("3087.in", "r", stdin);
#endif
  int n, i, j, index, cnt, c; scanf("%d", &n);
  string s1, s2, s3, s;
  set<string> myset;
  for (i = 1; i <= n; ++i){
    printf("%d ", i); cin >> c >> s1 >> s2 >> s3;
    s = s3; myset.clear(); cnt = index = 0;
    while (1){
      index = 0;
      for (j = 0; j < c; ++j){
        s[index++] = s2[j]; s[index++] = s1[j];
      } cnt++;
      if (s == s3){ printf("%d\n", cnt);break;}
      if (myset.count(s) == 1){printf("-1\n"); break;}
      else{
        s1.assign(s, 0, c); s2.assign(s, c, c);
        myset.insert(s);
      }
    }
  }

  return 0;
}

写代码的过程中还是出现了一些低级的错误,看来代码的准确度还是不行啊~

comments powered by Disqus