蜘蛛找出口
如下图所示(最左端数字代表横线的高度):
游戏规则
蜘蛛从上边任何一个编号处的线开始向下爬行,一遇到横线就转弯沿着横线爬,爬到另一条竖线就沿着该竖线向下爬,遇到横线再转弯。。。以此爬下去,知道爬出蜘蛛网,然后判断蜘蛛的爬出蜘蛛网的出口是编号为多少的线。
就按照上图所示,假设蜘蛛从1开始爬,则会依次经过1-2-3-4-3-2,最后出口为2。
使用程序语言实现该功能。
输入:1.蜘蛛网竖线的条数;
2.蜘蛛网横线的数量;
3.蜘蛛开始爬行时的竖线编号。
4.各横线的起始点和终止点所在竖线编号以及横线所在位置。
输出:蜘蛛最后爬出时的竖线编号。
为了简化模型,假设输入为三个数N、M、K,分别表示蜘蛛网竖线的条数,横线的数量,开始爬行时的竖线编号。竖线从左到右编号依次为1,2,3,4....。每条横线由三个参数决定:起始的值xl(表示与横线左端相连的竖线的编号)、终止值xr(表示与横线右端相连的竖线的编号)、高度y(表示从最下端0开始的高度,正整数)。
比如,对应上面的图,蜘蛛从1开始爬,对应的输入输出格式就应该如下:
输入:
5 9 1
1 2 8
1 2 5
1 2 3
2 3 7
2 3 2
3 4 5
3 4 3
4 5 7
4 5 1
输出:2
编程实现
这里最关键的是根据上面的规律通过数学化的语言方式将模型表示出来。
这里用M长度的数组xl[]、xr[]、y[]存储每条横线的参数信息。
假设最开始蜘蛛在编号为k的竖线上,向下爬,如果该条竖线上有横线,则xl或xr数组中存在元素的值为k,然后找出离蜘蛛最近的那条横线,找到后,如果是xl的元素,则蜘蛛到了k+1的竖线上,如果是xr的元素,则蜘蛛到了k-1的竖线上,然后依次类推,循环查找,每次都是找出比当前蜘蛛所在高度小的最高的那条横线,如果不存在相应的横线,则那条竖线就是蜘蛛的出口。
根据上面的描述,可以使用一个死循环来判断蜘蛛的爬行路径,找到出口后退出循环。
用java实现:
//注意位置是下一次一定要比上一次低,接着找出本次位置最高的那行
public class Spider {
public static void main(String[] args) {
// TODO Auto-generated method stub
int colNum=5,rowNum=9, start=3;
int []rowl={1,1,1,2,2,3,3,4,4};
int []rowr={2,2,2,3,3,4,4,5,5};
int []height={8,5,3,7,2,5,3,7,1,2};
int door= find(rowNum,start,rowl,rowr,height);
System.out.println("door: "+door);
}
public static int find(int rowNum,int start,int[] rowl,int[]rowr,int []height)
{
int tmpHeight=10000,tmpHeightPre=100000;
int step=0;
while(true)
{
tmpHeightPre=tmpHeight;
for(int i=0;i<rowNum;i++)
{
if(start==rowl[i]&&height[i]<tmpHeightPre)//如果位置比上一次低,则进入if判断,因为一次要比一次低
{
if(tmpHeightPre==tmpHeight)//如果是本次循环第一次
{
tmpHeight=height[i];
step=1;
}
else if(height[i]>tmpHeight)//找本次循环中位置最高的那一个
{
tmpHeight=height[i];
step=1;
}
}
if(start==rowr[i]&&height[i]<tmpHeightPre)
{
if(tmpHeightPre==tmpHeight)
{
tmpHeight=height[i];
step=-1;
}
else if(height[i]>tmpHeight)
{
tmpHeight=height[i];
step=-1;
}
}
}
if( tmpHeightPre==tmpHeight)
{
int door=start;
return door;
}
start=start+step;
}
}
}
posted on 2016-06-29 22:14 freshman2014 阅读(313) 评论(0) 收藏 举报