计蒜客 蓝桥杯Javab组 模拟赛5 连连看

本文介绍了一款连连看游戏的实现算法,通过递归深度优先搜索(DFS)寻找最佳匹配来最大化得分。游戏采用4x4网格布局,相同元素若位于边界上即可消除并获得分数。文章详细解释了如何通过遍历所有可能的配对来实现最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连连看是一款非常有意思的游戏。
我们可以把任意两个在图的在边界上的相同的方格一起消掉,比如把两个 444 消掉以后,

每次消掉两个方格的时候,都有会获得一个分数,第 iii 次消的分数为 i×i \timesi× 方格的值。比如上面的消法,是第一次消,获得的分数为 1×4=41 \times 4 = 41×4=4。
请你帮忙最优操作情况下,获得的分数最多为多少。
Java代码
ackage 模拟赛5;

public class l3 {
	
	
	static int a[][]={
			
			{1,4,2,5},
			{2,1,2,1},
			{3,1,3,2},
			{2,5,4,3},
	};
	static int dir[][]={
			{-1,0},
			{1,0},
			{0,-1},
			{0,1},
	};
	static boolean visited[][]=new boolean[4][4];
	static int max=0;
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		dfs(1,0);
		System.out.println(max);
		
	}
	public static void dfs(int step,int s)
	{
		if(s>max)
		{
			max=s;
		}
		
		
		
		for(int i=0;i<a.length;i++)
		{
			for(int j=0;j<a.length;j++)
			{
				for(int q=0;q<a.length;q++)
				{
					for(int p=0;p<a.length;p++)
					{
						if(i==q&&j==p) continue;
						
						if(a[i][j]==a[q][p]&&check(i,j)&&check(q,p))
						{
							
							visited[i][j]=visited[q][p]=true;
							int k =s+a[i][j]*step;
							dfs(step+1,k);
							
							visited[i][j]=visited[q][p]=false;;
							
						}
						
					}
				}
			}
		}
	
	
		
	}
	public static boolean check(int i,int j)
	{
		
		if(visited[i][j]==true)
			return false;
		
		
		for(int k=0;k<4;k++)
		{
			int xx=i+dir[k][0];
			int yy=j+dir[k][1];
			
			if(isout(xx,yy))
			{
				return true;
			}
			
			if(visited[xx][yy]==true)
				return true;
		}
		return false;
		
		
	}
	public static boolean isout(int xx,int yy)
	{
		if(xx>3||xx<0||yy>3||yy<0)
			return true;
		return false;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值