题意:
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12, 再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。给定输入s1和s2的初始状态 以及 预想的最终状态s12。
解题思路:模拟题 用map存储洗牌过后的状态字符串 然后根据洗牌的状态去对比题目给定的字符串
直接看代码
package 简单搜索;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* Created by user on 2017/8/22.
*/
public class poj3087 {
/**
*
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,
再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。给定输入s1和s2的初始状态 以及 预想的最终状态s12。
*/
static int n;
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
int t=scanner.nextInt();
for(int i=1;i<=t;i++){
n=scanner.nextInt();
scanner.nextLine();
String s1=scanner.nextLine();
String s2=scanner.nextLine();
String s=scanner.nextLine();
char ss1[]=s1.toCharArray();
char ss2[]=s2.toCharArray();
Map<String,Boolean> map=new HashMap<String, Boolean>();//用来存储题目给定的字符串和洗牌过后形成的字符串
map.put(s,true);//给题目给定的字符串加上标记 表示该字符串已经出现
int step=0;
while (true){
char a[]=new char[201];
//模拟洗牌
int ps=0;
for(int j=0;j<n;j++){
a[ps++]=ss2[j];
a[ps++]=ss1[j];
}
step++;
//吧字符数组转化成字符
String ss="";
for(int j=0;j<ps;j++){
ss+=a[j];//ss表示洗牌过后形成的字符串
}
if(ss.equals(s)){//如果洗牌过后的字符串等于题目给定的字符串就输出步数
System.out.println(i+" "+step);
break;
}
else if(map.containsKey(ss)){//如果洗牌过后该字符串在前面已经出现过就不需要在加入map中
if(map.get(ss)&&!ss.equals(s)){//洗牌过后字符串等于题目给定的字符串
System.out.println(i+" "+"-1");
break;
}
}
map.put(ss,true);//如果洗牌过后字符串在前面没出现过 就加入map并坐上标记
for(int j=0;j<n;j++){//按照洗牌规则 分配字符串
ss1[j]=a[j];
}
for(int k=0,j=n;j<2*n;j++,k++){
ss2[k]=a[j];
}
}
}
}
}