这道题,错不在于题目,而在于用的模板不是很完善,结果搞了很久,才在人家的解题报告里发现了问题所在!!!实在是冤啊!!! 注意Graham中,(top>0)这个条件的限制!!! #include<stdio.h> #include<string.h> #define max 1005 struct node { int x; int y; }g[max],min,stack[max]; int n,top=0; int pan(node yuan,node zhong,node last)//拐向判断 { return (yuan.x-zhong.x)*(last.y-zhong.y)-(last.x-zhong.x)*(yuan.y-zhong.y); } bool zhixian()//判断是否为直线 { int flag=0,i; for(i=2;i<n;i++) { if(pan(g[0],g[1],g[i])==0) flag++; } if(flag==n-2) return true; return false; } int dis(node a,node b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } void sort()//极角排序 { int i,j,k; for(i=1;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(pan(g[0],g[k],g[j])>0||(pan(g[0],g[k],g[j])==0&&dis(g[0],g[k])>dis(g[0],g[j]))) k=j; min=g[k]; g[k]=g[i]; g[i]=min; } } bool yi(node a,node b) { if(a.x!=b.x||a.y!=b.y) return true; return false; } void que() { int flag=0; int i,j; for(i=1;i<=top;i++) { for(j=0;j<n;j++) if(pan(stack[i-1],g[j],stack[i])==0&&yi(stack[i],g[j])&&yi(stack[i-1],g[j])) { flag++; break; } } if(flag==top) printf("YES/n"); else printf("NO/n"); } void graham() { int i; top=2; g[n]=g[0]; stack[0]=g[0]; stack[1]=g[1]; stack[2]=g[2]; for(i=3;i<=n;i++) { while(pan(stack[top-1],stack[top],g[i])>=0&&top>0)//此处注意些! top--; stack[++top]=g[i]; } stack[++top]=g[0]; } int main() { int t,i,k; scanf("%d",&t); while(t--) { scanf("%d",&n); scanf("%d%d",&g[0].x,&g[0].y); min=g[0];k=0; for(i=1;i<n;i++) { scanf("%d%d",&g[i].x,&g[i].y); if(g[i].y<min.y||(g[i].y==min.y&&g[i].x<min.x)) { min.x=g[i].x;min.y=g[i].y; k=i; } } min=g[k];g[k]=g[0];g[0]=min; if(n<6) printf("NO/n"); else if(zhixian()) printf("NO/n"); else { sort(); top=2; graham(); que(); } } return 0; }