http://acm.hdu.edu.cn/showproblem.php?pid=2108
Shape of HDU
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4405 Accepted Submission(s): 1956
創業是需要地盤的,HDU向錢江肉絲高新技術開發區申請一塊用地,很快得到了批覆,據說這是因爲他們公司研發的“海東牌”老鼠藥科技含量很高,預期將佔全球一半以上的市場。政府劃撥的這塊用地是一個多邊形,爲了描述它,我們用逆時針方向的頂點序列來表示,我們很想了解這塊地的基本情況,現在請你編程判斷HDU的用地是凸多邊形還是凹多邊形呢?
問題描述。
輸入N個點的座標,判斷這N個點能否構成一個凸多邊形。
2.問題分析。
根據2點確定一條直線的原理,即y-y1/x-x1=y2-y1/x2-x1;移向得x(y2-y1)+y(x1-x2)-x1y2+x2y1, 設t= x(y2-y1)+y(x1-x2)-x1y2+x2y1,假如可組成凸多邊形,且假設兩點是圖多邊形一邊,則把其他N-2點帶入, 得到的 t必均爲正或均爲負.由此可判斷任意2點是否爲凸多邊形的一條邊.
由任意點開始尋找能夠與其組成邊的點,若按順序能夠找到N點則其爲凸多邊形,
反之則不能.
Ac代碼:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
8913042 | 2013-08-12 11:27:55 | Accepted | 2108 | 125MS | 2936K | 809 B | Java | jack |
import java.util.Scanner;
public class hdu2108 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int flag=1;
while(cin.hasNext()){
int t= cin.nextInt();
if(t==0) break;
int [][]arr=new int[t][2];
int t2=t;
for(int i=0;i<t2;i++){
arr[i][0]=cin.nextInt();
arr[i][1]=cin.nextInt();
}
flag=1;
int a=arr[1][1]-arr[0][1];
int b =arr[0][0]-arr[1][0];
int c=arr[0][0]*arr[1][1];
int d=arr[1][0]*arr[0][1];
for(int i=2;i<t2;i++){
int m=arr[i][0]*a+arr[i][1]*b-c+d;
if(i==2){
if(m>0) flag=1;
else flag=-1;
}
if(m>0&&flag<0||m<0&&flag>0) {flag=0;flag=0;}
}
if(flag==0) System.out.println("concave");
else System.out.println("convex");
}
}
}