题目链接: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\n",ca++,dis);
 }
 return 0;
}