importjava.awt.Point;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Map;importjava.util.Scanner;importjava.util.StringTokenizer;public classMain {public static Map>readData(){
Scanner s= newScanner(System.in);
String input= null;
Map> pts = new HashMap>();if(s.hasNext()){
input=s.nextLine();
}
StringTokenizer st= new StringTokenizer(input, ",;");
st.nextToken();while(st.hasMoreTokens()){
Integer x=Integer.parseInt(st.nextToken());
Integer y=Integer.parseInt(st.nextToken());
ArrayList v = pts.get(x) == null ? new ArrayList() : pts.get(x);
v.add(newPoint(x, y));
pts.put(x, v);
}int key = 0;
Map> indexPts = new HashMap>();for(java.util.Map.Entry entry : pts.entrySet()){
indexPts.put(key, (ArrayList)entry.getValue());
key++;
}returnindexPts;
}
@SuppressWarnings({"rawtypes", "unchecked"})public static voidmain(String[] args) {
ArrayList ptOkList = new ArrayList();
Map> pts = readData();//读取数据并存储到map中
int i = 0;
Point startUp= pts.get(0).get(0);
Point startBottom= pts.get(0).get(0);
Point endUp= pts.get(pts.size() - 1).get(0);
Point endBottom= pts.get(pts.size() - 1).get(0);for(i = 0; i < pts.get(0).size(); i++){if(pts.get(0).get(i).y >startUp.y){
startUp= pts.get(0).get(i);
}if(pts.get(0).get(i).y
startBottom= pts.get(0).get(i);
}
}for(i = 0; i < pts.get(pts.size() - 1).size(); i++){if(pts.get(pts.size() - 1).get(i).y >startUp.y){
endUp= pts.get(pts.size() - 1).get(i);
}if(pts.get(pts.size() - 1).get(i).y
endBottom= pts.get(pts.size() - 1).get(i);
}
}
Point startPt=startUp;int index = 0;
Point p=startUp;while(true){float k = -Float.MAX_VALUE;for(i = index + 1; i < pts.size(); i++){//int index_ = index;
for(int j = 0; j < pts.get(i).size(); j++){
Point temp=pts.get(i).get(j);float kk = (temp.y - startPt.y) / (temp.x -startPt.x);if(kk >k){
p=temp;
k=kk;
index=i;
}
}
}
startPt=p;if(startPt ==endUp){break;
}
ptOkList.add(startPt);
}
startPt=endBottom;
index= pts.size() - 1;
p=endBottom;while(true){float k = -Float.MAX_VALUE;for(i = index - 1; i >= 0; i--){//int index_ = index;
for(int j = 0; j < pts.get(i).size(); j++){
Point temp=pts.get(i).get(j);float kk = (temp.y - startPt.y) / (temp.x -startPt.x);if(kk >k){
p=temp;
k=kk;
index=i;
}
}
}
startPt=p;if(startPt ==startBottom){break;
}
ptOkList.add(startPt);
}for(i = 0; i < pts.get(0).size(); i++){
ptOkList.add(pts.get(0).get(i));
}for(i = 0; i < pts.get(pts.size() - 1).size(); i++){
ptOkList.add(pts.get(pts.size()- 1).get(i));
}
System.out.print(ptOkList.size());for(i = 0; i < ptOkList.size(); i++){
System.out.print(";" + ptOkList.get(i).x + "," +ptOkList.get(i).y);
}
}
}