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

题目:

输入两个格子的编号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 FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 10005;
int dx[6]={0,-1,-1,0,1,1};//注意走的方向的顺序
int dy[6]={-1,-1,0,1,1,0};
struct Point{
    int x,y;
    Point(int xx=0,int yy=0):x(xx),y(yy){}
};
vector<Point> g;

void init(){
    g.clear();
    g.push_back(Point(0,0));
    g.push_back(Point(0,0));//对应编号1
    g.push_back(Point(1,1));//对应编号2
    int cnt=1;
    while(g.size()<maxn){
        for(int i=0; i<6; i++){
            int tcnt = (i==4?cnt+1:cnt);//向下要比其他方向多走一格
            while(tcnt--){
                int x = g.back().x+dx[i];
                int y = g.back().y+dy[i];
                g.push_back(Point(x,y));
            }
        }
        cnt++;//圈数也是每一个方向重复的个数
    }
}

int main(){
    //FRE();
    init();
    int a,b,ans;
    while(scanf("%d%d",&a,&b) && a){
        int x = g[b].x-g[a].x;
        int y = g[b].y-g[a].y;
       // cout<<"x:  "<<g[b].x<<" y:  "<<g[b].y<<endl;
       // cout<<"x:  "<<g[a].x<<" y:  "<<g[a].y<<endl;
        if((x>0&&y<0) || (x<0&&y>0)){
            ans = abs(x)+abs(y);
        }else{
            ans = max(abs(x),abs(y));
        }
        printf("The distance between cells %d and %d is %d.\n",a,b,ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/sykline/p/10359979.html

时间: 2024-08-03 08:09:05

UVA - 808 Bee Breeding (建立坐标系&找规律)的相关文章

uva 808 - Bee Breeding(坐标问题)

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

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

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

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

题意: 如图,按照图中的规律给这些格子编号.给出两个格子的编号,求从一个格子到另一个格子的最少步数.(一步只能穿过有有公共边的格子) 分析: 根据高中数学知识,选任意两个不共线的向量,就能表示平面上所有点. 像这样建立坐标系,根据图中的规律算出所有点的坐标. 推理也好,找找规律也好,不难发现 第一.三象限的点(x, y)到原点的距离为 |x| + |y| 第二.四象限的点(x, y)到原点的距离为 max{|x|, |y|} 递推点的坐标的时候也是比较注意细节的,否则很容易出错. 1 #incl

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 - 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

POJ 2265 Bee Maja (找规律)

题目链接 题意 : 给你两个蜂巢的编号,给你一个的编号让你输出在另外一个蜂巢中对应的编号. 思路 : 先将蜂巢分层,第一层一个数,第二层6个数,第三层12个数…………然后用公式表示出第n层的最后一个数是多少,下图中竖着的是x坐标,斜着的是y坐标,往左横坐标+1,往右横坐标-1,以斜线为准往上纵坐标-1,往下纵坐标+1,(1,1)也就是18是第三圈的第一个数,(2,1)也就是20是第四圈的第一个数. 1 #include <cstdio> 2 #include <cstring> 3

【UVA】11040 - Add bricks in the wall(找规律)

一道找规律的题,可以看出,大的三角形可以划分成好多个三层的三角形: [x] [a][x-a] [y] [    ][z] 这里面xyz都已知,所以可以求出a = (x + y - z ) /2 14043615 11040 Add bricks in the wall Accepted C++ 0.019 2014-08-15 06:02:50 #include<cstdio> #include<cstring> #include<iostream> #include&