题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511
题目大意:在一个8*8的棋盘中,给你一个起点位置和一个终点位置,同时也给你一个陷阱位置,问你从起点绕过陷阱到终点的最短距离。(可以上下左右走还可以斜走)
解题思路:可以直接用搜索,也可以用数学知识来解决,我们之前学过,两点之间直接最短,所以当陷阱不在这条直线上的时候,我们就不用考虑陷阱了,直接是max(abs(x1-y1),abs(x2-y2))最终结果,
但是如果陷阱在两条直线之间的话,只需要max(abs(x1-y1),abs(x2-y2))+1即可,这里要注意的是如果三点形成的直线是与X轴或Y轴平行的话,也是忽略陷阱。
AC代码:
#include <cstdio> #include <iostream> #include <cstdlib> using namespace std; int main() { int x1,y1,x2,y2,x3,y3,ca=1; while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF) { int dis=0; if((((y3-y2==x3-x2)&&(y3-y1==x3-x1))||((y3-y2==x2-x3)&&(y3-y1==x1-x3)))&&(x3<max(x1,x2)&&x3>min(x1,x2))) dis=max(abs(x2-x1),abs(y2-y1))+1; else dis=max(abs(x1-x2),abs(y1-y2)); printf("Case %d: %d ",ca++,dis); } return 0; }