2019年蓝桥杯练习3-楼号m和n之间的最短移动距离

本文详细解析了2019年蓝桥杯竞赛中一道关于寻找两座建筑间最短移动距离的题目。通过分析建筑编号的排列规律,提出了一种基于行列坐标的算法,用于计算任意两座建筑间的最短距离。该算法适用于X星球居民小区这种特定布局,且考虑了不能斜线移动的限制。

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

2019年蓝桥杯练习3-楼号m和n之间的最短移动距离

[问题描述]

 X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...

 当排满一行时,从下一行相邻的楼往反方向排号。

 比如:当小区排号宽度为6时,开始情形如下:

 1  2  3  4  5  6

 12 11 10 9  8  7

 13 14 15 .....

 我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

 输入为3个整数w m n,空格分开,都在1到10000范围内

 要求输出一个整数,表示m n 两楼间最短移动距离。

 [样例输入]

 6 8 2

 [样例输出]

 4

 [样例输入]

 4 7 20

 [样例输出]

 5

分析:

/*
找规律知:最短移动距离为两点横坐标差的绝对值+纵坐标差的绝对值。
奇数行:从小到大
偶数行:从大到小 
*/

#include<stdio.h>
#include<math.h>
int row(int w,int i) { //计算点的行号 
	int irow;  //下列计算取第一行的行号为1,而不是0 
	if(i%w==0) //值是宽度的倍数 
		irow=i/w;
	else      //值不是宽度的倍数 
		irow=i/w+1;
	return irow;
}
int col(int w,int j) {  //计算点的列号 
	int jcol;    //下列计算取第一列的列号为1,而不是0 
	if(row(w,j)%2==0) {  //该值在偶数行 
		if(j%w==0)  // 找规律可知,偶数行能被整除肯定在第一列 
		    jcol=1;
        else      //在偶数行(从大到小)但不能被整除,在倒数第j%w列,即正数第w-j%w+1列 
		    jcol=w-j%w+1;
	} else {  //在奇数行 
    	if(j%w==0)   //找规律可知,偶数行能被整除肯定在最后一列 
            jcol=w;
        else     //在奇数行(从小到大)但不能被整除,在第j%w列 
            jcol=j%w;
	}
	return jcol;
}
int main()
{
	int w,m,n;
	while(scanf("%d %d %d",&w,&m,&n)==3) {
		int s=fabs(row(w,n)-row(w,m))+fabs(col(w,n)-col(w,m));
		printf("%d\n",s);
	}
 	return 0;	
}

分析: 

 可以不用想得太复杂,直接找规律,重点是找到计算行号和列号的规律,多验证几组边缘的数据来确定规律是否正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值