题目记得不太清了,大概意思是:
小东和小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;
}
其实合理的话,也应该将所有斜角的情况写到函数调用或者递归里面去的
好多同学输入代码后,自己运行对着,但是放到指定的编译器中(赛码)去就报错
那么应该就是,我们大家写的代码不通用,只满足某些特定的例子,也就是说:我们的程序尽可能的完善一点!!!