路径规划(京东2016实习生真题)

来源:互联网 发布:零壹乐队 知乎 编辑:程序博客网 时间:2024/05/19 13:29

题目链接:http://exercise.acmcoder.com/online/online_judge_ques?ques_id=3813&konwledgeId=41

解题思路:不在同意条直线上的起点与终点,就让起点按着对角道先到达与终点同直线的过度点,再转玩(水平或垂直)走到终点

代码如下:

#include<stdio.h>int chan(char c){switch (c) {case 'a':return 1;case 'b':return 2;case 'c': return 3;case 'd': return 4;case 'e':return 5;case 'f':return 6;case 'g':return 7;case 'h':return 8;}}int abs(int x){return x>=0?x:-x;}void  f(int x,int y){int i;  if(x==0&&y==0){    return ;    }else if(x==0){    //printf("%d\n",y);    if(y>0){              for(i=1;i<=y;i++){              printf("D\n");              }}else{//y<0     y=abs(y);   for(i=1;i<=y;i++){              printf("U\n");                }}    }else if(y==0){    if(x>0){              for(i=1;i<=x;i++){              printf("L\n");              }}else{//x<0x=abs(x);   for(i=1;i<=x;i++){              printf("R\n");                }}        }else if(x>0&&y>0){    for(i=1;i<=x;i++){              printf("LD\n");                }        }else if(x<0&&y<0){    x=abs(x);     for(i=1;i<=x;i++){              printf("RU\n");                }        }else if(x>0&&y<0){    for(i=1;i<=x;i++){              printf("LU\n");                }    }else {    for(i=1;i<=y;i++){              printf("RD\n");                }}}int main(){char a1,a2;int d,dx,dy,x1,y1,x2,y2,x,y,i;while(scanf("%c%d",&a1,&y1)!=EOF){getchar();    scanf("%c%d",&a2,&y2);    getchar();    x1=chan(a1);    x2=chan(a2);    x=x1-x2;    y=y1-y2;    dx=abs(x);    dy=abs(y);    d=abs(dx-dy);    if(dx==dy){    printf("%d\n",dx);    f(x,y);    }else if(dx>dy){    printf("%d\n",dx);             if(x>0){             f(dy,y);             f(d,0);             }else{             f(-dy,y);             f(-d,0);             }        }else{    printf("%d\n",dy);    if(y>0){            f(x,dx);            f(0,d);    }else{    f(x,-dx);    f(0,-d);    }    }  }return 0;} 



0 0