#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; bool rcmp(int a, int b) { return a>b; } typedef long long LL; typedef struct { int x, y; } Point; char inseg(Point a, Point b, Point c) { LL dx1=a.x-b.x; LL dy1=a.y-b.y; LL dx2=c.x-b.x; LL dy2=c.y-b.y; LL dd = dx1*dy2-dy1*dx2; if (dd) return 0; if ((c.x-a.x)*(c.x-b.x)<=0&&(c.y-a.y)*(c.y-b.y)<=0) return 1; return 0; } char cross(Point a, Point b, Point c, Point d) { LL dx1=a.x-b.x; LL dy1=a.y-b.y; LL dx2=c.x-b.x; LL dy2=c.y-b.y; LL dd = dx1*dy2-dy1*dx2; if (dd==0) { if ((c.x-a.x)*(b.x-a.x)>=0 && (c.y-a.y)*(b.y-a.y)>=0) return 1; // no care for reverse return 0; } LL dx=d.x-c.x; LL dy=d.y-c.y; // (c.y+k*dy-b.y)*(a.x-b.x) = (a.y-b.y)*(c.x+k*dx-b.x) LL va = (a.x-b.x)*dy-(a.y-b.y)*dx; if (va==0) return 0; LL vb = (a.y-b.y)*(c.x-b.x)-(a.x-b.x)*(c.y-b.y); if (va<0) vb=-vb; if (vb>0) return 0; dx=a.x-b.x; dy=a.y-b.y; // (b.y+k*dy-d.y)*(c.x-d.x) = (c.y-d.y)*(b.x+k*dx-d.x) va = (c.x-d.x)*dy-(c.y-d.y)*dx; if (va==0) return 0; vb = (c.y-d.y)*(b.x-d.x)-(c.x-d.x)*(b.y-d.y); if (va<0) vb=-vb; if (vb>0) return 0; return 1; } Point pp[16]; char dp[1<<12][13][12]; int mk[12][12]; char ck[12][12][12][12]; int gn; char dfs(int m, int s, int e) { if (m==0) return 0; if (dp[m][s][e]==-2) return gn+1; if (dp[m][s][e]!=-1) return dp[m][s][e]; dp[m][s][e]=-2; char r = gn, t; int i, j; if (s==gn) { for (i=0; i