京东2016笔试题
2016-04-10 16:47
369 查看
题目记得不太清了,大概意思是:
小东和小C两个人在棋盘(如下:8×8)上,相互指定位置,并打印小东到小C需要走的最短步数,以及走过的最短路径,走的每一步的方向可以为:
上(U),下(D),左(L),右(R),左上(LU),左下(LD),右上(RU),右下(RD)
也就是说:当前的位置可以走到跟它相邻(有公共的点或者边)的任意一个位置
小东可以任意选择方向,一个方向就相当与一步(也就是说:走右下(RD)跟走右(R),是一样的,都是一步)
![](https://img-blog.csdn.net/20160410140638094?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
小东到达小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;
程序:
其实合理的话,也应该将所有斜角的情况写到函数调用或者递归里面去的
好多同学输入代码后,自己运行对着,但是放到指定的编译器中(赛码)去就报错
那么应该就是,我们大家写的代码不通用,只满足某些特定的例子,也就是说:我们的程序尽可能的完善一点!!!
小东和小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; }
其实合理的话,也应该将所有斜角的情况写到函数调用或者递归里面去的
好多同学输入代码后,自己运行对着,但是放到指定的编译器中(赛码)去就报错
那么应该就是,我们大家写的代码不通用,只满足某些特定的例子,也就是说:我们的程序尽可能的完善一点!!!
相关文章推荐
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总