poj 3087 Shuffle'm Up(bfs)
2015-05-20 20:14
417 查看
题意:
给定长度都为C两个字符串,S1,S2,和一个要求的结果字符串S12。先把 S2 的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到新的S12,再把S12最下面的C个字符赋值给S1,把剩下的赋值给S2,再次重复上面的过程。最后求出要得到目标字符串S,问最少需要几步。注意:
题目所给出的输入是从低向上排列的。解析:
简单的bfs问题,直接模拟就好了。AC代码:
[code]#include <iostream> #include <map> #include <string> #include <queue> #include <algorithm> using namespace std; typedef long long ll; map<string, int> mp; int n; string tar; string trans(string s1, string s2) { string s12 = ""; for(int i = 0; i < n; i++) { s12 += s2[i], s12 += s1[i]; } return s12; } int bfs(string s1, string s2) { queue<string> que; string s12 = trans(s1, s2); mp[s12] = 1; que.push(s12); while(!que.empty()) { string front = que.front(); que.pop(); if(front == tar) return mp[front]; s1 = front.substr(0, n); s2 = front.substr(n, n); s12 = trans(s1, s2); if(mp[s12] > 0) return -1; mp[s12] = mp[front] + 1; que.push(s12); } return -1; } int main() { //freopen("in.txt", "r", stdin); int T, cas = 1; string s1, s2; cin >> T; while(T--) { mp.clear(); cin >> n; cin >> s1 >> s2 >> tar; int ans = bfs(s1, s2); cout << cas++ << ' ' << ans << endl; } return 0; }
相关文章推荐
- Poj 3087 Shuffle'm Up 【BFS】
- POJ-3087 Shuffle'm Up 解题报告(陈小宾)
- 模拟-POJ-3087-Shuffle'm up
- POJ 3087 Shuffle'm Up (模拟)
- POJ 3087 Shuffle'm Up(模拟)
- POJ 3087 Shuffle'm Up
- poj 3087 Shuffle'm Up (模拟)
- Shuffle'm Up (poj 3087 模拟)
- poj 3087 Shuffle'm Up
- poj 3087 Shuffle'm Up
- poj 3087 Shuffle'm Up (kuangbin带你飞--简单搜索)
- poj-3087-Shuffle'm Up-模拟
- poj 3087 Shuffle'm Up
- POJ 3087:Shuffle'm Up
- POJ 3087 Shuffle'm Up(....)
- POJ 3087 Shuffle'm Up (模拟)
- poj 3087 Shuffle'm Up (模拟搜索)
- POJ 3087 Shuffle'm Up - 模拟
- POJ 3087 - Shuffle'm Up
- POJ 3087 Shuffle'm Up(简单模拟)