浏览器标题切换
浏览器标题切换end

蓝桥杯2015初赛 - 移动距离 - 找规律

题目链接

http://oj.ecustacm.cn/problem.php?id=1261

思路

我本来是想用Dijkstra写的,发现建图的时候没有办法建出来。

看了题解勉强懂了。

  1. 首先判断给出的两个数所在行列(也就是其坐标);

  2. 之后再判断他们的奇偶性。如果是奇数说明那一列的数据是倒序(倒着)输入的,翻转一下就行;

  3. 需要注意的是,以下代码是建立建图下标从0开始的,而不是1。

AC代码

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f

int main()
{
	int w, w1, w2;
	while (cin >> w >> w1 >> w2)
	{
		//cout << (3 & 1) << endl; // 奇数1
		//cout << (2 & 1) << endl; // 偶数0
		int x1 = (w1 - 1) / w, x2 = (w2 - 1) / w; // 计算w1和w2所在的行
		// -1 是因为下标都从0开始
		int y1 = (w1 - 1) % w, y2 = (w2 - 1) % w; // 计算w1和w2所在的列
		if (x1 & 1) y1 = w - 1 - y1; // 判断是否是奇数
		if (x2 & 1) y2 = w - 1 - y2; // 判断是否是奇数
		//w-1是因为下标从0开始,判断是奇数的话说明那一列的数是倒序,需要反转
		int ans = abs(x1 - x2) + abs(y1 - y2); // 输出曼哈顿距离
		printf("%d\n", ans);
	}
	return 0;
}
posted @ 2020-10-12 17:29  抓水母的派大星  阅读(96)  评论(0编辑  收藏  举报