设计算法:模拟
题目大意:洗牌大家都知道吧,有两叠纸牌,每叠张数相同,将这两叠纸牌混合到一起,最底下一张为第二叠纸牌的最底下一张,然后上面是第一叠纸牌的最底下一张,依次交叉,最上面一张为第一叠纸牌的最上面一张。如下图所示:
将s12平均分成两部分,下面的部分为s1上面的部分为s2,按照以上的方式再次进行洗牌,依次类推。
问,是否可以通过以上方式得到目标S
这题被归类到bfs,但是感觉没有用到任何的bfs,只是简单地模拟
代码如下:
题目大意:洗牌大家都知道吧,有两叠纸牌,每叠张数相同,将这两叠纸牌混合到一起,最底下一张为第二叠纸牌的最底下一张,然后上面是第一叠纸牌的最底下一张,依次交叉,最上面一张为第一叠纸牌的最上面一张。如下图所示:
将s12平均分成两部分,下面的部分为s1上面的部分为s2,按照以上的方式再次进行洗牌,依次类推。
问,是否可以通过以上方式得到目标S
这题被归类到bfs,但是感觉没有用到任何的bfs,只是简单地模拟
代码如下:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main_3087 {
static int n;//每一叠纸牌的张数
static char[] s1;//第一叠纸牌,不同的字符代表不同的颜色
static char[] s2;//第二叠纸牌
static char[] s;//长度为2n,最终需要获得的纸牌
static Map<String, Boolean> used;
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
int m=in.nextInt();
String a1,a2,a;
int i=1;
while(m-->0)
{
used=new HashMap<String,Boolean>();
n=in.nextInt();
s1=new char[n];
s2=new char[n];
s=new char[2*n];
a1=in.next();
a2=in.next();
a=in.next();
s1=a1.toCharArray();
s2=a2.toCharArray();
s=a.toCharArray();
System.out.println((i++)+" "+solve());
}
}
static int solve()
{
char[] result;
int count=0;
while(true)
{
result=shuffle(s1, s2);
count++;
if(used.get(String.valueOf(result))!=null)
{
return -1;
}
used.put(String.valueOf(result),true);
if(isEquals(result, s))
{
return count;
}
for(int i=0;i<n;i++)
{
s1[i]=result[i];
}
for(int i=n;i<2*n;i++)
{
s2[i-n]=result[i];
}
}
}
static char[] shuffle(char[] c1,char[] c2)
{
char[] c=new char[2*n];
for(int j=0;j<n;j++)
{
c[2*j]=c2[j];
c[2*j+1]=c1[j];
}
return c;
}
static boolean isEquals(char[] c1,char[] c2)
{
for(int i=0;i<2*n;i++)
{
if(c1[i]!=c2[i])
{
return false;
}
}
return true;
}
}