博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1870--Bee Breeding(模拟)
阅读量:5272 次
发布时间:2019-06-14

本文共 1444 字,大约阅读时间需要 4 分钟。

题目链接:

题目大意:给出一个蜂窝,也就是有六边形组成,从内向外不断的循环(如图)。给出两个数的值u,v按六边形的走法,由中心向六个角走。问由u到v的的最小步数。

首先处理处每个数的坐标,让1点位(0,0)其它的点预先处理出来。

然后计算两个数的距离时,我们能够计算两个数的位置横坐标差位x。纵坐标差位y,当x < y的时候。依照斜线走,走到同样列的时候就能够直接向下走。一直到v,在向下走的时候,一步能够走坐标中的2的距离。

当x>=y的时候,能够先斜线走走到同样的行。然后横正走,一直找到v,在横着走的时候,一次仅仅能走一个坐标。

#include 
#include
#include
#include
using namespace std ;struct point{ int x , y ;}p , q , a[10010] ;int s[6][2] = { {-1,-1},{-1,1},{0,2},{1,1},{1,-1},{0,-2} } ;void init() { a[1].x = a[1].y = 0 ; int k , i , j , cnt = 1 ; for(k = 2 ; cnt < 10000 ; k++) { p.x = a[cnt].x ; p.y = a[cnt].y-2 ; a[++cnt] = p ; for(i = 0 ; i < 6 ; i++) { for(j = 0 ; j < k-1 ; j++) { if( i == 0 && j == k-2 ) continue ; p.x += s[i][0] ; p.y += s[i][1] ; a[++cnt] = p ; if( cnt == 10000 ) break ; } if( cnt == 10000 ) break ; } }}int main() { init() ; int u , v , x , y , ans ; while( scanf("%d %d", &u, &v) && u+v ) { x = abs(a[u].x-a[v].x) ; y = abs(a[u].y-a[v].y) ; ans = 0 ; if( x < y ) { ans = x + (y-x)/2 ; } else ans = y + (x-y) ; printf("The distance between cells %d and %d is %d.\n", u, v, ans ) ; } return 0 ;}

转载于:https://www.cnblogs.com/yfceshi/p/7191636.html

你可能感兴趣的文章
汇编指令
查看>>
Leader of All Crushing Machines in the Future
查看>>
luogu 4211
查看>>
Sql Server 默认值
查看>>
JavaEE之反射
查看>>
【转】经验分享:大型高并发高负载网站的系统架构
查看>>
HDU 6060 RXD and dividing (求贡献)
查看>>
java中 immutable,future,nio
查看>>
VMware ESX常用命令
查看>>
golang三方包应该如何安装--在线和离线
查看>>
选择排序
查看>>
鼠标移入移出透明度变化效果
查看>>
我工作这十年-世界在变化
查看>>
log4j2 不使用配置文件,动态生成logger对象
查看>>
[IOI2014]holiday假期(分治+主席树)
查看>>
从gitbook将书籍导入到github中
查看>>
python的上下文管理(contextlib)(2)
查看>>
mysql安装
查看>>
运算符有感
查看>>
设置dataGridView单元格颜色、字体、ToolTip、字体颜色
查看>>