UVa 808 (建坐标系、找规律) Bee Breeding

题意:

如图,按照图中的规律给这些格子编号。给出两个格子的编号,求从一个格子到另一个格子的最少步数。(一步只能穿过有有公共边的格子)

分析:

根据高中数学知识,选任意两个不共线的向量,就能表示平面上所有点。

像这样建立坐标系,根据图中的规律算出所有点的坐标。

推理也好,找找规律也好,不难发现

  • 第一、三象限的点(x, y)到原点的距离为 |x| + |y|
  • 第二、四象限的点(x, y)到原点的距离为 max{|x|, |y|}

递推点的坐标的时候也是比较注意细节的,否则很容易出错。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn = 10000;
 6
 7 struct Point
 8 {
 9     int x, y;
10     Point(int x=0, int y=0):x(x), y(y) {}
11 }p[maxn + 330];
12
13 int dx[] = {-1, -1, 0 , 1 , 1 , 0 };    //六个方向
14 int dy[] = {0 , 1 , 1 , 0 , -1, -1};
15 int pos;
16
17 void cal(int dir, int l)    //按照dir方向递推l个格子的坐标
18 {
19     pos++;
20     while(l--)
21     {
22         p[pos] = Point(p[pos-1].x+dx[dir], p[pos-1].y+dy[dir]);
23         pos++;
24     }
25     pos--;
26 }
27
28 void Init()
29 {
30     p[2] = Point(1, -1);
31     pos = 2;
32     for(int l = 1; l <= 58; ++l)
33     {
34         for(int dir = 0; dir < 4; ++dir)
35             cal(dir, l);
36         cal(4, l+1);
37         cal(5, l);
38     }
39 }
40
41 int main()
42 {
43     Init();
44
45     int n, m;
46     while(scanf("%d%d", &n, &m) == 2 && n)
47     {
48         int x = p[n].x - p[m].x;
49         int y = p[n].y - p[m].y;
50         int ans;
51         if((x<0&&y>0) || (x>0&&y<0)) ans = max(abs(x), abs(y));
52         else ans = abs(x+y);
53
54         printf("The distance between cells %d and %d is %d.\n", n, m, ans);
55     }
56
57     return 0;
58 }

代码君

时间: 2024-08-04 11:17:43

UVa 808 (建坐标系、找规律) Bee Breeding的相关文章

UVA - 808 Bee Breeding (建立坐标系&amp;找规律)

题目: 输入两个格子的编号a和b(a,b≤10000),求最短距离.例如,19和30的距离为5(一条最短路是19-7-6-5-15-30). 思路: 如图建立坐标系,然后看两个点的向量如果位于二四象限答案为向量坐标绝对值的和,向量位于一三象限答案为向量坐标绝对值的最大值. 看网上的博客的思路--(菜是原罪) 难点是建立坐标系. 代码: #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define MAX 1000000000 #define F

UVa 1620 Lazy Susan (找规律)

题意:给 n 个数,每次可以把4个连续的数字翻转,问你能不能形成1-n的环状排列. 析:找一下奇偶性,写几个数试试,就会找到规律. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #include <qu

UVa 12627 (递归 计数 找规律) Erratic Expansion

直接说几个比较明显的规律吧. k个小时以后,红气球的个数为3k. 单独观察一行: 令f(r, k)为k个小时后第r行红气球的个数. 如果r为奇数,f(r, k) = f((r+1)/2, k-1) * 2 如果r为偶数,f(r, k) = f(r/2, k-1) 令g(r, k)为k个小时后前r行红气球的个数. 如果r为偶数,g(r, k) = g(r/2, k-1) * 3; 如果r为奇数,g(r, k) = g(r-1, k) + f(r, k); 因此f和g都可以用递归求解. 1 #inc

uva 808 - Bee Breeding(坐标问题)

题目链接:uva 808 - Bee Breeding 题目大意:按照题目中图片的方式将所有的正六边形标上序号,然后给出两个序号,问这两六边形最短要走多少步. 解题思路:将图中的坐标系进行修改 这样,每个位置和周围(除了左上角和右下角)位置相邻,只需要一步. 并且建坐标的方法可以按照6条边的方式 #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using

POJ 1870 Bee Breeding(找规律)

题目链接 题意 : 给你一个蜂巢状图形,让你找出两个点之间的距离. 思路 : 在做这个题之前可以看一下2265,因为是一种题来着,规律就是我在2265里写的那样,然后就是求距离了,求距离的时候只需考虑两个点的坐标差值(x,y),把坐标差值分成四个项限,x>0且y>0,或x<0且y<0为abs(x+y),其他情况则是max(abs(x),abs(y)).. 1 #include <cstdio> 2 #include <cstring> 3 #include

UVA 1363 Joseph&#39;s Problem 找规律+推导 给定n,k;求k%[1,n]的和。

/** 题目:Joseph's Problem 链接:https://vjudge.net/problem/UVA-1363 题意:给定n,k;求k%[1,n]的和. 思路: 没想出来,看了lrj的想法才明白. 我一开始往素数筛那种类似做法想. 想k%[1,n]的结果会有很多重复的,来想办法优化. 但没走通. 果然要往深处想. 通过观察数据发现有等差数列.直接观察很难确定具体规律:此处应该想到用式子往这个方向推导试一试. lrj想法: 设:p = k/i; 则:k%i = k-i*p; 容易想到

(白书训练计划)UVa 12627 Erratic Expansion(递归+找规律)

题目地址:UVa 12627 这题是先找规律,规律在于对于第k个小时的来说,总是可以分成右下角全是蓝色气球,右上角,左下角与左上角三个一模一样的k-1个小时的气球.这样的话,规律就很清晰了,然后用递归做比较方便... 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <ma

UVA - 11384 - Help is needed for Dexter (找规律!!)

UVA - 11384 Help is needed for Dexter Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem H Help is needed for Dexter Time Limit: 3 Second Dexter is tired of Dee Dee. So he decided to keep Dee Dee b

递推+高精度+找规律 UVA 10254 The Priest Mathematician

题目传送门 1 /* 2 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 3 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子,2 ^ (n - k) - 1 4 所以f[n] = min (f[k] * 2 + g[n-k]),n<=10000,所要要用高精度,另外打表能看出规律 5 */ 6 /************************************************ 7 * Auth