2016.年4月8日7点到9点考题,两个编程题,就做出这一个了,第二个没时间了,感觉第二个编程题还好,不是很难)
题目大致意思就是给定一个8×8的棋盘,给定两个点A,B,求从A到B需要走的最短步数,并打印最短路径。
确定A到B的路径时,优先走斜的的路径,然后走直的。
比如从(5,1)到(8,8)
需要的最短步数为7,
分别为右上、右上、右上、上、上、上、上。
即输入
51
88
输出
7
RU
RU
RU
U
U
U
U
分析:
全面考虑各种情况,只有斜线的、只有直线的、直线斜线都有的(优先打印斜线)。
提交的通过的代码如下:
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
string s;
string t;
while(cin >> s >> t)
{
char startx = s[0];
char starty = s[1];
char endx = t[0];
char endy = t[1];
int dis_x = endx - startx;
int dis_y = endy - starty;
int ans = abs(dis_x)> abs(dis_y)?abs(dis_x):abs(dis_y);
string res;
cout << ans << endl;
//确定斜着走的方向
if(dis_x > 0 && dis_y > 0 )
res = "RU";
else if(dis_x > 0 && dis_y < 0)
res = "RD";
else if(dis_x < 0 && dis_y > 0)
res = "LU";
else if(dis_x < 0 && dis_y < 0)
res = "LD";
//最短路径只有斜着走的情况
if(abs(dis_x) == abs(dis_y))
{
for(int i = 0;i < abs(dis_x);i++)
cout << res << endl;
}
//最短路径只有上下的方向
else if(dis_x == 0)
{
if(dis_y > 0)
{
for( int i = 0;i < ans ;i++)
cout << "U" <<endl;
}
else
{
for( int i = 0;i < ans ;i++)
cout << "D" <<endl;
}
}
//最短路径只有左右的方向
else if(dis_y == 0)
{
if(dis_x > 0)
{
for( int i = 0;i < ans ;i++)
cout << "R" <<endl;
}
else
{
for( int i = 0;i < ans ;i++)
cout << "L" <<endl;
}
}
//最短路径有直线,也有斜线的情况
else
{
int temp = abs(dis_x) - abs(dis_y);
//题目要求优先走斜线
for(int i = 0;i< ans - abs(temp);i++)
cout << res << endl;
//然后计算直线
if(temp > 0)
{
if(dis_x > 0 )
{
for(int i = 0 ;i< temp; i++)
cout << "R" << endl;
}
else
{
for(int i = 0 ;i< temp ;i++)
cout << "L" << endl;
}
}
else
{
if(dis_y > 0 )
{
for(int i = 0 ;i< abs(temp); i++)
cout << "U" << endl;
}
else
{
for(int i = 0 ;i< abs(temp) ;i++)
cout << "D" << endl;
}
}
}
}
cout << "Hello world!" << endl;
return 0;
}