`
Touch_2011
  • 浏览: 290494 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
阅读更多

1.描述

     有些问题难以找到公式或规律来解决,可以按照步骤,模拟人的解决行为,一步一步往下走就能找到答案。

2.实例分析

   1)(北大考研机试)一根长度为1米的木棒上有若干只蚂蚁在爬动。它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右。如果两只蚂蚁碰头,则它们立即交换速度并继续爬动。三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止。如果它们爬到了木棒的边缘(0100厘米处)则会从木棒上坠落下去。在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即123…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动。给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间。

 

输入

第一行包含一个整数表示蚂蚁的个数N2<=N<=99),之后共有N行,每一行描述一只蚂蚁的初始状态。每个初始状态由两个整数组成,中间用空格隔开,第一个数字表示初始位置厘米数P1<=P<=99),第二个数字表示初始方向,-1表示向左,1表示向右,0表示静止。
输出

蚂蚁A从开始到坠落的时间。若不会坠落,输出“Cannot fall!”

样例输入

4

10 1

90 0

95 -1

98 -1

样例输出

98

 

分析:输入蚂蚁信息后,模拟时间从1开始增加,时间每增加1,改变在木棒上各个蚂蚁的位置,然后判断是否有蚂蚁坠落、是否有三只蚂蚁碰头(因为只有一只蚂蚁的速度是0,所以最多只可能发生一处三只蚂蚁碰头的情况,关键是找到速度为0的蚂蚁)、判断是否有两只蚂蚁碰头。直到蚂蚁A坠落则结束。注意:a、每次碰撞后从第一只蚂蚁检测碰撞 b、碰撞可能发生在整数点的位置也可能发生在非整数点的位置

实现:a.定义蚂蚁的结构体:包含蚂蚁的速度,蚂蚁的位置

         b.定义一个数组,数组元素是一只蚂蚁。初始化蚂蚁信息

          c.循环,每次时间加1,改变蚂蚁位置,然后判断。。。直到蚂蚁A坠落

 

 

/**
  * 蚂蚁坠落
  *
  **/

#include<stdio.h>
#define MAX_ANT_NUMBER 101 //最大蚂蚁数量

//蚂蚁结构体定义如下
typedef struct
{
	int speed;//蚂蚁的速度,有正负之分(+1或者是-1)
	int site;//蚂蚁的位置
}Ant;

Ant antArray[MAX_ANT_NUMBER];
int front,rear,index,k; //分别指向蚂蚁数组的第一只、A、最后一只蚂蚁、速度为0的蚂蚁
int time=0;

//初始化蚂蚁的信息
void init()
{
	int i;
	front=0;
	printf("please enter ant's number:\n");
	scanf("%d",&rear);
	printf("please enter ant's site speed:\n");
	for(i=0;i<rear;i++){
		scanf("%d%d",&antArray[i].site,&antArray[i].speed);
		if(antArray[i].speed==0)
			k=index=i;
	}
  	rear--;  
}

//蚂蚁移动
int move()
{
	int i,temp;
	int f=0;
	while(1){
		//A蚂蚁坠落
		if(antArray[index].site==0||antArray[index].site==100)
			break;
		//判断两端是否有蚂蚁坠落
		if(antArray[front].site==0){
			front++;
		}
		if(antArray[rear].site==100){
			rear--;
		} 
		//处理碰头,发生碰头交换速度。注意,没发生一次碰头,便从第一只蚂蚁开始检测是否发生碰头
		for(i=front;i<=rear-1;i++){
     		//判断是否三只蚂蚁碰头,有的话交换速度
     		if(k-1>=front && k+1<=rear && antArray[k-1].speed==1 && antArray[k+1].speed==-1 && 
				antArray[k-1].site+1==antArray[k].site && antArray[k+1].site-1==antArray[k].site){
                temp=antArray[k-1].speed;
                antArray[k-1].speed=antArray[k+1].speed;
		        antArray[k+1].speed=temp;
				i=front-1;
				f=1;
				continue;
			}
			//判断是否有两只蚂蚁碰头(其中一只速度为0),有的话交换速度
			if(antArray[k-1].speed==1 && (antArray[k-1].site==antArray[k].site)){
               temp=antArray[k].speed;
               antArray[k].speed=antArray[k-1].speed;
			   antArray[k-1].speed=temp;
			   k=k-1;
			   i=front-1;
			   f=1;
			   continue;
			}
			if(antArray[k+1].speed==-1 && (antArray[k+1].site==antArray[k].site)){
               temp=antArray[k].speed;
               antArray[k].speed=antArray[k+1].speed;
			   antArray[k+1].speed=temp;
			   k=k+1;
			   i=front-1;
			   f=1;
			   continue;
			}

			//判断是否有两只蚂蚁速度都不为0的蚂蚁碰头,分两种碰头情况
			//不是在整数点位置碰头
			if(antArray[i].speed==1 && antArray[i+1].speed==-1 && antArray[i].site-1==antArray[i+1].site){
               temp=antArray[i].speed;
               antArray[i].speed=antArray[i+1].speed;
			   antArray[i+1].speed=temp;
			   antArray[i].site--;
			   antArray[i+1].site++;
			   i=front-1;
			   f=1;
			   continue;
			}
			//在整数点位置碰头
    		if(antArray[i].speed==1 && antArray[i+1].speed==-1 && antArray[i].site==antArray[i+1].site){
               temp=antArray[i].speed;
               antArray[i].speed=antArray[i+1].speed;
			   antArray[i+1].speed=temp;
			   i=front-1;
			   f=1;
			   continue;
			}
		}
		for(i=front;i<=rear;i++)
			//蚂蚁走一步
            antArray[i].site+=antArray[i].speed;			
        time++;
		if(time>100 && f==0)
			return 0;
	}
	return 1;
}
void main()
{
	init();
	if(move())
    	printf("蚂蚁A坠落的时间是:%d\n",time);
	else
    	printf("Can't fall\n");

}

 

2)打印蛇形矩阵(也称螺旋上三角)

分析与代码实现:http://touch-2011.iteye.com/blog/1044775

  

(3)鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:欢迎免费品尝我种的花生!——熊字
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。

 


我们假定多多在每个单位时间内,可以做下列四件事情中的一件:

1)
从路边跳到最靠近路边(即第一行)的某棵花生植株;

2)
从一棵植株跳到前后左右与之相邻的另一棵植株;

3)
采摘一棵植株下的花生;

4)
从最靠近路边(即第一行)的某棵花生植株跳回路边。

现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。

例如在图2所示的花生田里,只有位于(2, 5), (3, 7), (4, 2), (5, 4)的植株下长有花生,个数分别为13, 7, 15, 9。沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。

Input

输入的第一行包括一个整数T,表示数据组数
每组输入的第一行包括三个整数,M, NK,用空格隔开;表示花生田的大小为M * N1 <= M, N <= 50),多多采花生的限定时间为K0 <= K <= 1000)个单位时间。接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij0 <= Pij <= 500)表示花生田里植株(i, j)下花生的数目,0表示该植株下没有花生。

Output

输出包括T行,每一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。

 

分析:注意到题目要求“找出剩下的植株里花生最多的,去采摘它的花生”。所以先走进花生地,每次要采下一株花生之前,先计算一下是否有足够的时间走到那株花生、采摘、回到路上,如果时间不够,则采摘活动结束。

实现:定义一个二维数组存放花生地,找出最多花生的那株的位置,然后根据多多的当前位置判断是否能摘这株花生,如果不能则结束。

 

(4)题目:

 

分析:

 

 

 

 

 

  • 大小: 85.8 KB
  • 大小: 106.3 KB
0
1
分享到:
评论

相关推荐

    浅析遗传算法在电力系统中的应用.pdf

    "遗传算法在电力系统中的应用" ...文献[7]采用十进制整数进行编码,把模拟退火、模糊逻辑和免疫算法相融合。 遗传算法在电力系统中的应用具有广阔的前景和潜力,能够帮助解决电力系统中的各种复杂问题。

    浅析遗传算法在智能组卷系统中的应用.pdf

    遗传算法(Genetic Algorithm, GA)是一种基于生物进化理论的全局优化算法,它通过模拟自然选择和遗传的过程,寻找问题的最佳解。遗传算法的核心思想是通过模拟生物群体的进化,包括选择、交叉(重组)和变异等操作...

    浅析遗传算法在智能组卷系统中的应用.rar

    遗传算法是一种基于生物进化原理的优化方法,由美国科学家John Holland在20世纪60年代提出,它模拟了自然界中的生物进化过程,如选择、交叉和变异等机制,用于求解复杂问题。在智能组卷系统中,遗传算法被广泛应用于...

    浅析何谓分水岭算法(WatershedAlgorithm).pdf

    算法的核心思想是通过模拟水的流动和积累,寻找图像中的“分水岭”,即区域间的边界。 在实际应用中,分水岭算法有多种实现方法,包括拓扑学、形态学、浸水模拟和降水模拟等。这些方法虽然有所不同,但基本原理是...

    机器学习算法应用浅析.pdf

    "机器学习算法应用浅析" 机器学习是研究如何使用机器来模拟人类学习活动的一门科学,研究机器获取新知识和新技能,并识别现有知识。机器学习可以分为监督学习和无监督学习两个类别,前者需要用户知道目标值,也就是...

    算法文档无代码浅析信息学竞赛中一类与物理有关的问题

    首先,我们来分析“算法文档无代码浅析信息学竞赛中一类与物理有关的问题”这个标题。这里提到了三个主要点:算法文档、信息学竞赛和与物理有关的问题。算法文档是竞赛准备的核心,它包含了大量与算法相关的理论知识...

    浅谈蚁群算法.pdf

    本文介绍了一种新型模拟进化算法蚁群算法该方法通过模拟蚁群搜索食物的过程,达 到求解组合优化问题的目的

    各类遗传算法论文的合集

    《浅析遗传量子算法与遗传算法在函数极值问题中的比较法》对比了两种算法在解决极值问题上的性能,可能揭示了各自的优点和局限性。 3. **多极值函数优化**:遗传算法在处理具有多个局部最优解的问题时面临挑战。...

    浅析模拟滤波器和数字滤波器的区别

    浅析模拟滤波器和数字滤波器的区别 模拟滤波器和数字滤波器是两种不同的信号处理方式,它们之间有着本质的区别。模拟滤波器用于连续时间系统,也可以用在离散时间系统中,而数字滤波器用于离散系统。 模拟滤波器...

    PLC温控系统中的PID算法应用浅析.pdf

    PLC温控系统中的PID算法应用浅析 在自动化控制领域,温度控制是极其重要的一个环节,尤其在工业生产和实验室环境中,精确的温度控制对于产品质量和实验准确性至关重要。电加热炉作为一种常见的加热设备,其温度控制...

    浅析分布式路由算法QOS性能研究与仿真.pdf

    通过模拟不同的网络环境和业务场景,可以测试QoS路由协议在实际网络中的性能表现,包括路由的响应时间、吞吐量、丢包率等指标。这种仿真是验证分布式路由算法在实际网络中可行性的关键步骤。 综上所述,分布式路由...

    浅析改进粒子群算法在变电站选址定容中的应用.pdf

    粒子群优化算法作为一种高效的优化算法,起源于对鸟群觅食行为的模拟,其核心思想是将问题的潜在解表示为搜索空间中的粒子,并通过粒子之间的信息交换与合作来寻找最优解。PSO算法在搜索过程中动态调整粒子的飞行...

    浅析电力系统状态估计算法的综合分析.pdf

    五是通过离线模拟实验提高数据准确性,并处理不完整的远动装置数据。 基本的电力系统状态估计算法通常是基于最小二乘法,尤其是加权最小二乘法,这种方法能快速分解,适应性强。在选择算法时,需要综合考虑电力系统...

    一类带观测传感器延时修正(时间同步)的融合算法举例浅析

    ### 一类带观测传感器延时修正(时间同步)的融合算法举例浅析 #### 关键知识点解析 在本文中,我们探讨了一类带观测传感器延时修正(时间同步)的融合算法,并通过一个日常生活中的例子来进行浅析。该例子通过...

    浅析物流配送最短路径选择方法--蚁群算法参考.pdf

    通过模拟自然界蚂蚁群体的搜索行为,蚁群算法能够在大规模的搜索空间中寻找出近似最优解,为物流企业提供了一种有效解决路径优化问题的手段。然而,由于算法中涉及参数设置和信息素更新规则的复杂性,对于蚁群算法的...

    浅析遗传量子算法与遗传算法在函数极值问题中的比较法 (2008年)

    遗传算法是一种模拟生物进化的算法.它被广泛利用在信号处理、模式识别、人工生命等领域.遗传量子算法是将量子计算和遗传算法相结合算法.采用量子位染色体的表示形式.该算法具有量子计算的量子位和量子位的迭加...

    浅析12306售票算法(java版)

    《12306售票算法解析(Java版)》 12306是中国铁路客户服务中心的官方网站,其售票系统采用了一种独特的算法来处理庞大的购票需求。本文将重点探讨12306售票算法的Java实现,以及如何在实际操作中确保公平性和效率...

    电源技术中的浅析数字电源VS模拟电源的优劣势对比

    此外,数字电源还支持复杂的控制算法,如预测控制和自适应控制,这些算法在模拟电源中实现起来较为困难。 然而,模拟电源也有其独特的优势。首先,模拟电源在处理小信号时具有较高的精度和稳定性,尤其在低噪声、高...

    常用车牌定位算法浅析

    5. 基于遗传算法的车牌定位方法:遗传算法是一种模拟自然选择和遗传学机制的搜索算法,能够用于优化车牌定位问题。通过编码车牌定位问题为基因串,利用选择、交叉和变异等操作进行优化,从而得到最优的车牌定位解。...

Global site tag (gtag.js) - Google Analytics