POJ 3087 Shuffle'm Up
2015-08-15 22:16
309 查看
题目大意:
有两个长度为K的字符串S1,S2,两个字符串的字符交叉放置组成新的长为2*k的字符串s3,与题目给出的S相比较,若不相同,s3的前K个字符重新组成s1,剩余的组成s2,继续循环,若最终能和S相同,输出所需步数,不可行则输出impossible.
思路:
用模拟做就行了,虽然这题放在模拟专题里,但是只有一个入口,用BFS意义不大。
#include <iostream>
#include <map>
using namespace std;
int main()
{
int ss;
cin >> ss;
for (int i = 1; i <= ss; ++i)
{
int k;
map <string,int> p;
string s1,s2,s,s3;
cin >> k;
cin >> s1 >> s2 >> s3;
s = "";
int cnt = 0;
int ok = 1;
while (1)
{
for (int j = 0; j != k; ++j)
{
s += s2[j];
s += s1[j];
}
cnt++;
if (s != s3)
if (p[s] == 0)
p[s]++;
else
{
ok = 0;
break;
}
else
break;
s1 = s.substr(0,k);
s2 = s.substr(k,k);
s = "";
}
cout << i << ' ';
if (ok)
cout << cnt << endl;
else
cout << -1 << endl;
}
return 0;
}
有两个长度为K的字符串S1,S2,两个字符串的字符交叉放置组成新的长为2*k的字符串s3,与题目给出的S相比较,若不相同,s3的前K个字符重新组成s1,剩余的组成s2,继续循环,若最终能和S相同,输出所需步数,不可行则输出impossible.
思路:
用模拟做就行了,虽然这题放在模拟专题里,但是只有一个入口,用BFS意义不大。
#include <iostream>
#include <map>
using namespace std;
int main()
{
int ss;
cin >> ss;
for (int i = 1; i <= ss; ++i)
{
int k;
map <string,int> p;
string s1,s2,s,s3;
cin >> k;
cin >> s1 >> s2 >> s3;
s = "";
int cnt = 0;
int ok = 1;
while (1)
{
for (int j = 0; j != k; ++j)
{
s += s2[j];
s += s1[j];
}
cnt++;
if (s != s3)
if (p[s] == 0)
p[s]++;
else
{
ok = 0;
break;
}
else
break;
s1 = s.substr(0,k);
s2 = s.substr(k,k);
s = "";
}
cout << i << ' ';
if (ok)
cout << cnt << endl;
else
cout << -1 << endl;
}
return 0;
}
相关文章推荐
- 一篇优秀的招聘文案
- Linux中的特殊权限
- 打开链接公众号发送红包php版
- wg_pagenation 1.1 自己写的一个分页插件_基于Jquery 20151008
- 观察者模式
- 显示遮罩层和弹出框
- 树
- junit基础学习之-参数初始化(5)
- Java数据结构
- Zball in Tina Town
- Service
- 多线程异步加载图片async_pictures
- 五、MongoDB的索引
- NOIP2010-普及组复赛模拟试题-第二题-数字积木
- 编写高质量代码改善C#程序的157个建议——建议45:为泛型类型参数指定逆变
- POJ 2251 Dungeon Master
- Android Layout Resource分析
- 二叉搜索树(Binary Search Tree)的查找
- Partition List
- 杭州电子科技大学acm---2007