百度2014校园招聘笔试题——连连看判断消除算法

看到今年百度有一道笔试题考察的是《编程之美》上边的连连看游戏中消除判断算法,正好这几天查找资料学习,写了简单的连连看游戏,在这里把消除判断算法分析总结一下。

连连看游戏中允许消除的条件有两个:1. 玩家点击的两个图案相同 2. 两个图形之间存在不超过三个弯的路径。难点在于判断第二个条件。

1. 如果两个图案在一条水平线或者一条垂直线上,则有可能存在一条线可以相连的路径。

2. 如果两个图案不在一条直线上,则取其中一个图案位置为基准,另一个图案的位置可能为左上、左下、右上、右下。这种情况下,则有可能存在两条线或者三条线可以相连的路径。

分析这些情况可以发现,首先需要定义两个最基本的方法可以检查水平方向、垂直方向任意两点之间是否存在通路。然后可以通过这两种方法进行遍历整个图案分布网格区域,寻找是否存在不超过三个弯的路径实现两个图案之间相连。两条线、三条线路径分别的可能情况是横竖、竖横、横竖横、竖横竖。

两个基本方法用JS实现如下:

function CheckX(xStart, yStart, xEnd)
{
	for (var i = xStart; i != xEnd; (i<xEnd ? i++ : i--))
	{
		if (picArray[i][yStart] != " ")
		{
			return false;
		}
	}
	return true;
}
function CheckY(yStart, xStart, yEnd)
{
	for (var i = yStart; i != yEnd; (i<yEnd ? i++ : i--))
	{
		if (picArray[xStart][i] != " ")
		{
			return false;
		}
	}
	return true;
}
随后可以写出通过这两个方法来遍历寻找各个路径可能性的JS实现方法如下:

function CheckLink(P1, P2)
{
	if (P1.y > P2.y) //将P1作为基准,存储纵坐标较小的那个位置。则P2可能位于P1的正下、正左、正右、左下或者右下位置。
	{
		var temp = P1;
		P1 = P2;
		P2 = temp;
	}	
	if (CheckY(P1.y+1, P1.x, P2.y) && CheckX(P1.x, P2.y, P2.x))//调用方法检查直接相连或者两条线相连的可能路径(横、竖、横竖)
	{
		return true;
	}
	for (var i = P1.x-1; i >= 0; i--) //从P1先往左侧走,再往垂直方向,再水平方向检查三条线路径(横竖横)
	{
		if (picArray[i][P1.y] != "")
		{
			break;
		}
		if (CheckY(P1.y+1, i, P2.y) && CheckX(i, P2.y, P2.x))
		{
			return true;
		}
	}
	for (i = P1.x+1; i < maxRow+2; i++)//从P1先往右侧走,再往垂直方向,再水平方向检查三条线路径(横竖横)
	{
		if (picArray[i][P1.y] != "")
		{
			break;
		}
		if (CheckY(P1.y+1, i, P2.y) && CheckX(i, P2.y, P2.x))
		{
			return true;
		}
	}
	if (P1.x > P2.x)//将P1作为基准,存储横坐标较小的那个位置
	{
		temp = P1;
		P1 = P2;
		P2 = temp;
	}
	if (CheckX(P1.x+1, P1.y, P2.x) && CheckY(P1.y, P2.x, P2.y))//检查一条线、两条线可能路径(横、竖、竖横)
	{
		return true;
	}
	for (i = P1.y-1; i >= 0; i--)//从P1先往上走,再水平方向、垂直方向检查竖横竖路径(竖横竖)
	{
		if (picArray[P1.x][i] != "")
		{
			break;
		}
		if (CheckX(P1.x+1, i, P2.x) && CheckY(i, P2.x, P2.y))
		{
			return true;
		}
	}
	for (i = P1.y+1; i < maxCol+2; i++)//从P1先往下走,再水平方向、垂直方向检查竖横竖可能路径(竖横竖)
	{
		if (picArray[P1.x][i] != "")
		{
			break;
		}
		if (CheckX(P1.x+1, i, P2.x) && CheckY(i, P2.x, P2.y))
		{
			return true;
		}
	}
	return false;
}
这样就可以判断两个图案之间是否存在可以相连的路径了。

参考:http://bbs.csdn.net/topics/310100938

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值