传送门:
![](https://images2015.cnblogs.com/blog/1119476/201706/1119476-20170625040249257-1350430416.png)
Sample Input 1
4 2 30 1 3 11 1 4 12 0 2 2
![](https://images2015.cnblogs.com/blog/1119476/201706/1119476-20170625040324710-666519436.png)
题意:判断是否可以在图内连线使相同数字连接起来。
题解:作图可以发现只要不是两个点都位于矩形边界之上,都一定可以通过各种神奇的扭曲实现连接(总有缝可以钻:))。所以排除所有两点不同时在矩形边界的线段,剩下的只需要保证两点都在边界的线段不相交即可,然而正常判断线段相交方法需要N^2。自己做的时候只会排序后按斜率确定边界是否合法,但是需要判断两点在同一边的线段是否跨越当前线段,非常麻烦。官方题解用了栈处理,按顺时针排序所有线段后(线段两点也按顺时针方向排序),按顺时针遍历每个点,如果是线段起始点,push这个点对应的终止点。如果是线段终止点,检查栈顶是否是这个点,如果不是则当前点线段则和应该出现的点的线段一定相交,具体看代码。
![](https://images2015.cnblogs.com/blog/1119476/201707/1119476-20170706233430128-1371247202.png)
右图遍历到A‘时栈顶应该为B‘,所以不成立。
代码:
1 #define _CRT_SECURE_NO_DEPRECATE 2 #pragma comment(linker, "/STACK:102400000,102400000") 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include