POJ 3087 题解
作者:互联网
没什么用的目录
题目地址
AC代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int t;
cin>>t;
for (int i = 0; i < t; ++i) {
int n;
cin>>n;
string a,b,target;
cin>>a>>b>>target;
vector<string>list;
string temp="";
for (int j = 0; j < n; ++j) {
for (int k = 0; k <= 1; ++k) {
if(!k)temp+=b[j];
else temp+=a[j];
}
}
list.push_back(temp);
while(find(list.begin(),list.end(),target)==list.end()){
a = (list.end()-1)->substr(0,n);
b = (list.end()-1)->substr(n,n);
temp = "";
for (int j = 0; j < n; ++j) {
for (int k = 0; k <= 1; ++k) {
if(!k)temp+=b[j];
else temp+=a[j];
}
}
if(find(list.begin(),list.end(),temp)!=list.end()){
cout<<i+1<<' '<<"-1"<<endl;
break;
}else list.push_back(temp);
}
if(find(list.begin(),list.end(),target)!=list.end())cout<<i+1<<' '<<find(list.begin(),list.end(),target)-list.begin()+1<<endl;
}
return 0;
}
题解和题目思路
这道题还是一道简单的模拟题,只需要模拟洗牌的过程然后构造出结果字符串再进行判断即可。
要判断给出的洗牌目标结果是否能够出现,即判断在目标结果出现之前是否出现了重复的洗牌结果。
每次洗完牌之后,将洗牌的结果压入栈内,如果栈内出现了重复的洗牌结果,那么整个过程就会进入一个循环,不可能在后续的结果之中出现给定的目标结果,输出-1。如果在此之前就出现了目标结果,找到其下标,+1输出即可。
标签:结果,int,题解,洗牌,++,POJ,3087,include 来源: https://blog.csdn.net/a47451516/article/details/104088302