poj3087

设计算法:模拟
题目大意:洗牌大家都知道吧,有两叠纸牌,每叠张数相同,将这两叠纸牌混合到一起,最底下一张为第二叠纸牌的最底下一张,然后上面是第一叠纸牌的最底下一张,依次交叉,最上面一张为第一叠纸牌的最上面一张。如下图所示:

将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;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值