9911请你编程 卜天明 2000年 第2期 #1 9911请你编程   读者朋友们新年好!《请你编程》又与你们见面了。《请你编程》得到了广大朋友的关心和支持,我在这里表示衷心的感谢。《请你编程》是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看本期重庆读者杨先飞的解法。   9911请你编程解题思路   将蜂窝形分成12个区域,如^02020401a^1:蜂房1为区域0;直线2-9-22为区域8;直线3-11-25为区域9;直线4-13-28为区域10;直线5-15-31为区域11;直线6-17-34为区域12;直线7-19-37为区域7;区域7与区域8之间为区域1,区域8与区域9之间为区域2,区域9与区域10之间为区域3,区域10与区域11之间为区域4,区域11与区域12之间为区域5,区域12与区域7之间为区域6。 然后对每个小六边形定义如^02020401b^2:   最后,求出与number1的边1相邻的六边形,再求出与该六边形的边1相邻的六边形,以此类推,然后求与number2的边1相邻的六边形,再检查此六边形number1是否已求出,如果还没有求出,就继续计算下一个六边形,然后再次判断……。最后在计算出的路径中选择出最短路径。程序使用Turbo C++ 3.00调试通过。   源程序   #include   #include   #include   #include   int cal_loca(int number)// 计算number所处的层数   { int loca=2,tmp=2;    while(number>=tmp) {tmp=tmp+(loca-1)*6;loca++;}    return --loca;}   int cal_start(int loca)// 计算loca层的开始数字,参数loca为number所处的层数   { if(loca<3) return loca;int i=3,start=2;    for(;i<=loca;i++) start=start+(i-2)*6;return start;}   int which_seg(int number)//计算number位于哪条边上   { if(number==1) return 0;    int start,loca,a[6],i;loca=cal_loca(number);start=cal_start(loca);    a[0]=start+loca*6-7;a[1]=start+loca-2;    for(i=2;i<6;i++) a[i]=a[i-1]+loca-1;    for(i=0;i<6;i++) if(number==a[i]) return i+7;   for(i=1;i<6;i++) if(number0?seg-1:6)) return next_start+dis+seg-1;   if((seg==6?1:seg+1)==which) return number+1;   if((whichloca2?loca1:loca2)*2+1;//两点之间的最大步数不超过 max_step tmp_num1=(int*)malloc(sizeof(int) *max_step);tmp_num2=(int*)malloc(sizeof(int) *max_step);    tmp_num1[0]=number1;tmp_num2[0]=number2;cout<