您的位置:首页 > 职场人生

京东2016笔试题

2016-04-10 16:47 369 查看
题目记得不太清了,大概意思是:

小东和小C两个人在棋盘(如下:8×8)上,相互指定位置,并打印小东到小C需要走的最短步数,以及走过的最短路径,走的每一步的方向可以为:

上(U),下(D),左(L),右(R),左上(LU),左下(LD),右上(RU),右下(RD)

也就是说:当前的位置可以走到跟它相邻(有公共的点或者边)的任意一个位置

小东可以任意选择方向,一个方向就相当与一步(也就是说:走右下(RD)跟走右(R),是一样的,都是一步)



小东到达小C比较喜欢走斜角,因为他觉得走斜路将更容易到达目的地

示例:

小C为小东指定:a8                  小东为小C指定:h1

那么输入输出就是:

a8 h1        (输入)

7               (输出)

RD

RD

RD

RD

RD

RD

RD

分析:

1,因为是8×8的棋盘,所以考虑用二维数组

2,输入的是:a8,h1,b3等这一类字符,我们必须将其转化到相应的数组中去(如:将a8,转换为数组位置(0,7),将h1,转换为数组位置(7,0))

3,根据小东和小C的相应位置,调用不同的算法

      1,先考虑两个位置是不是相等,如果相等,直接退出;

      2,判断两者位置是不是在同一列或者同一列,如果是,调用相应的函数,运行完毕,退出;

      3,如果不在同一行或者同一列的话,那么判断大概的位置,左上,左下,右上,右下,调用一次相应的函数,然后继续执行1,2,3;

程序:

#include <stdio.h>

int graph[8][8]= {0};
int flag = 0;     //标志着,只打印一次总步数
int step,step1,step2;

void col(int x , int y , int x1, int y1)
{

if(x == y)   //同一列
{
if(x1 > y1) //小东在上,小C在下
{

step = x1-y1;
if(flag == 0)
printf("%d\n", step);
while(step --)
printf("D\n");
}
if(x1 < y1)
{
step = y1 - x1;
if(flag == 0)
printf("%d\n", step);
while(step--)
printf("U\n");
}
}
}

void hang(int x, int y, int x1, int y1)
{
                        if(x1 == y1)  //同一行
                        {
                                if(x < y)
                                {
                                        step = y-x;
                                        if(flag == 0)
                                                printf("%d\n", step);
                                        while(step --)
                                        {
                                                printf("R\n");  
                                        }
                                }
                                if(x > y)
                                {
                                        step = x - y;
                                        if(flag == 0)
                                                printf("%d\n", step);
                                        while(step --)
                                        {
                                                printf("L\n");  
                                        }
                                }
                        }
}

int main()
{
        int x,y,x1,y1;
        char a[10], b[10];
        scanf("%s %s", a, b);
        
                
        x = a[0] - 'a';
        x1 = a[1] - '1';
        y = b[0] - 'a';
        y1 = b[1] - '1';                      //(x,x1)为小东的坐标   (y,y1)为小C的坐标

        if(x>= 0 && x <8 && x1>= 0 && x1 < 8) //合理的小东坐标
        {
                if(y>= 0 && y< 8 && y1>= 0 && y1<8)//合理的小C坐标
                {
                        if(x == y && x1 ==y1 )
                                return 0;      //如果两者位置相同直接退出
                        col(x, y, x1, y1);     //判断在不在同一列
                        hang(x, y, x1, y1);    //判断在不在同一行
                        
                        if(x < y && x1 > y1)   //右下角的情况(即就是小c位于小东的右下角)
                        {
                                step = y- x;                                                                                                    
                                step1 = x1 - y1;
                                if(step >= step1)
                                        step2 = step;
                                else
                                        step2 = step1;
                                printf("%d\n", step2);
                                flag = 1;
                                while(x != y && x1 != y1)
                                {
                                        x++;
                                        x1--;
                                        printf("RD\n");
                                        
                                        col(x, y, x1, y1);
                                        hang(x , y,x1, y1);

                             }
                        }
                        else if(x > y && x1 < y1)   //左上角
                        {       
                                flag = 1;
                                step = x - y;
                                step1 = y1 - x1;
                                if(step >= step1)
                                        step2 = step;
                                else
                                        step2 = step1;
                                printf("%d\n", step2);
                                while(x != y && x1 != y1)
                                {
                                        x--;
                                        x1++;
                                        printf("LU\n");
                                        
                                        col(x,y, x1,y1);        
                                        hang(x,y, x1, y1);

                                }
                        }

                      else if(x < y && x1 < y1)   //右上角的情况
                        {
                                flag = 1;
                                step = y - x;
                                step1 = y1 - x1;
                                if(step >= step1)
                                        step2 = step;
                                else
                                        step2 = step1;
                                printf("%d\n", step2);
                                while(x != y && x1 != y1)
                                {
                                        x++;
                                        x1++;
                                        printf("RU\n");
                                        
                                        col(x,y,x1, y1);
                                        hang(x,y, x1, y1);      
                                }
                        }

                        else if(x > y && x1 > y1)   //左下角的情况
                        {
                                flag = 1;
                                step = x - y;
                                step1 = x1 - y1;
                                if(step >= step1)
                                        step2 = step;
                                else
                                        step2 = step1;
                                printf("%d\n", step2);
                                while(x != y && x1 != y1)
                                {
                                        x--;
                                        x1--;
                                        printf("LD\n");
                                        
                                        col(x,y,x1, y1);
                                        hang(x,y,x1, y1);       
                                }
                        }

                }
        }
        return 0;

}                                             
 


其实合理的话,也应该将所有斜角的情况写到函数调用或者递归里面去的

好多同学输入代码后,自己运行对着,但是放到指定的编译器中(赛码)去就报错

那么应该就是,我们大家写的代码不通用,只满足某些特定的例子,也就是说:我们的程序尽可能的完善一点!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息