蓝桥 移动距离

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范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。


例如:
用户输入:
6 8 2
则,程序应该输出:
4


再例如:
用户输入:
4 7 20
则,程序应该输出:
5


资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

#include <cstdio>
#include <cmath>
using namespace std;
int main() 
{
	int w,m,n;
	scanf ("%d%d%d",&w,&m,&n);
	int x1,x2,y1,y2;
	x1=(m-1)/w;
	y1=(m-1)%w;
	x2=(n-1)/w;
	y2=(n-1)%w;
	if (x1%2) y1=w-y1-1;
	if (x2%2) y2=w-y2-1;
	printf ("%d\n",abs(x1-x2)+abs(y1-y2));
	return 0;
}


### BFS算法在蓝桥杯中的应用 #### 什么是BFS? 广度优先搜索(Breadth-First Search, BFS)是一种用于图结构的遍历或搜索算法。它按照层次顺序访问节点,通常借助队列来实现。对于蓝桥杯比赛而言,掌握BFS是非常重要的,因为它可以解决许多涉及路径寻找、最短距离计算等问题。 #### BFS的核心思想 BFS通过从起始点出发逐步扩展到相邻节点的方式工作。其核心在于利用队列存储待访问的节点,并标记已访问过的节点以防重复处理[^1]。 #### C语言实现BFS的基本框架 以下是基于邻接表表示的一个简单BFS模板: ```c #include <stdio.h> #include <stdlib.h> #define MAX_NODES 1000 // 图的最大节点数 int visited[MAX_NODES]; // 访问标志数组 typedef struct Queue { int data[MAX_NODES]; int front; int rear; } Queue; // 初始化队列 void initQueue(Queue *q) { q->front = q->rear = -1; } // 入队操作 void enqueue(Queue *q, int value) { if(q->rear == MAX_NODES - 1){ printf("Queue is full.\n"); return; } if(q->front == -1) q->front++; q->data[++(q->rear)] = value; } // 出队操作 int dequeue(Queue *q) { if(q->front > q->rear || q->front == -1){ printf("Queue is empty.\n"); return -1; } return q->data[(q->front++)]; } // BFS函数定义 void bfs(int startNode, int adjacencyMatrix[][MAX_NODES], int nodeCount) { Queue queue; initQueue(&queue); visited[startNode] = 1; // 标记起点为已访问 enqueue(&queue, startNode); while(queue.front <= queue.rear){ // 当队列不为空时继续循环 int currentNode = dequeue(&queue); printf("%d ", currentNode); // 输出当前节点 for(int i = 0; i < nodeCount; ++i){ if(adjacencyMatrix[currentNode][i] && !visited[i]){ visited[i] = 1; enqueue(&queue, i); } } } } ``` 此代码片段展示了如何使用C语言实现基本的BFS功能[^4]。 #### 蓝桥杯中常见的BFS应用场景 1. **迷宫问题** 在蓝桥杯比赛中,经常会出现类似于“给定一个二维网格地图,找到从入口到达出口的最短路径”的题目。这类问题非常适合采用BFS求解,因为BFS能够保证首次抵达目标位置所经过的就是最短路径[^2]。 2. **连通性检测** 如果需要判断某个无向图是否完全联通或者统计其中有多少个独立子集,则可以通过多次调用BFS完成相应任务。 3. **最小步数类问题** 如某些情况下要求计算最少移动次数才能使某种状态发生变化的问题也常用到BFS方法来进行解答。 #### 示例题解——试题E: 迷宫 假设我们遇到一道典型的迷宫寻路问题,在这个问题里我们需要找出一条由起点通往终点的有效路线并且这条线路应该是所有可行方案中最短的一条。下面给出了一种可能的解决方案思路及其部分伪码描述: 设定方向向量dx[]={-1,0,+1,0},dy[]={0,-1,0,+1};分别代表上左下右四个行走方向;创建辅助布尔型visit[][]记录各格子的状态;建立先进先出的数据容器que用来暂存坐标信息以及对应的距离值dist;最后依据具体输入条件调整边界判定逻辑即可得到最终答案[^3]。 ```c while(!que.empty()){ pair<int,int> curPos=dequeuqe(); if(curPos.first==targetX&&curPos.second==targetY){ break;//达到目的地退出循环 } ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值