博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杭电1030
阅读量:5359 次
发布时间:2019-06-15

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

 

题意:求在如下的图中的一个数字到另一个数字穿越的最少边数。

Analyse:
若m,n在同一行上,则step=|m-n|;若不在同一行,先确保m<n。然后讨论:1.m所在的三角形向下,第一步必定先向左(或向右)移动,再向下移动;2.m所在的三角形向上,第一步必定向下移动,然后再向左(或向右)移动。因此第一步先研究m所在三角形的位置和方向,若向下则先向左(或向右)移动一步。后面的移动都以m所在三角形向上为基础。若有移动,先设step=1,否则step=0。
设行距为d,列距为hd;
若行距与列距相等,则step=step+d*2;
若行距小于列距,则step=step+2*d+hd-d;
若行距大于列距且n所在三角形向上,则step=step+2*hd+((d-hd)/2)*4;
若行距大于列距且n所在三角形向下,则step=step+2*hd+((d-hd)/2)*4+1;
 
View Code
1 #include
2 #include
3 //以下函数由m的值判断出m所在的行,m位置在所在行的序数,该行序号,该行的中间三角形的序数 4 void locate(int n,int *mid,int *thisn,int *row) 5 {
6 *row =(int) ceil(sqrt(n)); 7 *mid = *row; 8 *thisn = n-(*row-1)*(*row-1); 9 } 10 int horizon(int m,int mid1,int thisn1,int n,int mid2,int thisn2) 11 {
12 //本函数的操作都以m所在三角形向上为基础 13 // printf("m=%d,thisn1=%d,mid1=%d,thisn2=%d,mid2=%d\n",m,thisn1,mid1,thisn2,mid2); 14 if( (thisn1-mid1)*(thisn2-mid2)<0 )//n,m分布在中轴两侧 15 return abs(thisn1-mid1)+abs(thisn2-mid2); 16 else 17 return abs( abs(thisn1-mid1)-abs(thisn2-mid2) ); 18 } 19 main() 20 {
21 int n,m,temp; 22 int mid1,thisn1,row1,mid2,thisn2,row2; 23 int d,step,hd;//d储存行距,step储存穿越的边数,hd储存m与n之间水平距离 24 while(scanf("%d%d",&m,&n)==2) 25 {
26 if(m>n) 27 {
28 temp=n; 29 n=m; 30 m=temp; 31 } 32 locate(m,&mid1,&thisn1,&row1); 33 locate(n,&mid2,&thisn2,&row2); 34 d=row2-row1; 35 // printf("d=%d,hd=%d\n",d,horizon(m,mid1,thisn1,n,mid2,thisn2) ); 36 if(d==0) 37 step=thisn2-thisn1; 38 else 39 {
40 step=0; 41 if(row1%2-m%2!=0)//m所在的三角形向下 42 {
43 //m先右移一个三角形 44 if( horizon(m-1,mid1,thisn1-1,n,mid2,thisn2)>=horizon(m+1,mid1,thisn1+1,n,mid2,thisn2) ) 45 {
46 m++; 47 thisn1++; 48 } 49 //m先左移一个三角形 50 else 51 {
52 m--; 53 thisn1--; 54 } 55 step=1; 56 } 57 hd=horizon(m,mid1,thisn1,n,mid2,thisn2); 58 //以下操作都以m所在三角形向上为基础 59 if(hd>=d)//若列距大于等于行距 60 step+=hd+d; 61 else 62 {
63 d-=hd;//先到与n同列数的三角形,到了一个向上的三角形 64 step+=2*hd; 65 step+=4*(d/2); 66 if(n%2-row2%2!=0)//n所在的三角形向下 67 step++; 68 } 69 } 70 printf("%d\n",step); 71 } 72 }
大量的注释方便程序的调试。

转载于:https://www.cnblogs.com/ZShogg/archive/2012/03/30/2425752.html

你可能感兴趣的文章
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>
关于python中带下划线的变量和函数 的意义
查看>>
linux清空日志文件内容 (转)
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>
Ajax : load()
查看>>
MySQL-EXPLAIN执行计划Extra解释
查看>>
Zookeeper概述
查看>>
Linux自己安装redis扩展
查看>>
luoguP3414 SAC#1 - 组合数
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
Spring mvc初学
查看>>
VTKMY 3.3 VS 2010 Configuration 配置
查看>>
01_1_准备ibatis环境
查看>>