• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

洛谷 P8623 [蓝桥杯 2015 省 B] 移动距离

P8623 [蓝桥杯 2015 省 B] 移动距离

题目描述

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

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

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

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

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

输入格式

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

$w$ 为排号宽度,$m,n$ 为待计算的楼号。

输出格式

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

输入输出样例 #1

输入 #1

6 8 2

输出 #1

4

输入输出样例 #2

输入 #2

4 7 20

输出 #2

5

说明/提示

时限 1 秒, 256M。

蓝桥杯 2015 年省赛 B 组 H 题。

题目链接

https://www.luogu.com.cn/problem/P8623

解题思路

  1. 先找到n,m中最大的直接给n,只需要从1遍历到n
  2. 分为正方向列号y++超过w时,y=w,行号x++;反方向列号y--小于1时,y=1,行号x++
  3. 当i=m时,找到了m点,然后最终答案为abs(kx-x)+abs(ky-y)

代码实现

//模拟 
#include <bits/stdc++.h>
using namespace std;
int x=1,y=0;
int kx,ky;
int main()
{
	int w,m,n;cin>>w>>m>>n;
	if(m>n)swap(n,m);
	for(int i=1;i<=n;i++){
		if(x%2==1){	// 正方向 
			y++;
			if(y>w)y=w,x++;
		}else {	//反方向 
			y--;
			if(y<1)y=1,x++; 
		}
		if(i==m)kx=x,ky=y;
	}
	cout<<abs(kx-x)+abs(ky-y);
	return 0;
}
posted on 2026-06-22 10:38  SobNov  阅读(3)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3