蓝桥杯2015初赛 - 移动距离 - 找规律
题目链接
http://oj.ecustacm.cn/problem.php?id=1261
思路
我本来是想用Dijkstra写的,发现建图的时候没有办法建出来。
看了题解勉强懂了。
-
首先判断给出的两个数所在行列(也就是其坐标);
-
之后再判断他们的奇偶性。如果是奇数说明那一列的数据是倒序(倒着)输入的,翻转一下就行;
-
需要注意的是,以下代码是建立建图下标从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;
}