poj 1231 java

仍是wrong answer。放在这方便多平台看。

Source Code
import java.util.Scanner;
import java.util.*;  
import java.math.*; 
import java.lang.*;
public class Main {
 static class Pair{
  int x;
  int y;
  int ch;
 };
 
 /**
  * @param args
  */
 public static void main(String[] args) {
  int n;
  Pair side[][] = new Pair[27][2];
  Scanner scanner = new Scanner(System.in);
  n = scanner.nextInt();
  int k,p;
  int inputX=0,inputY=0;
  while(n--!=0){
   k = scanner.nextInt();
   p = scanner.nextInt();
   for(int i=0;i!=k; ++i){
    side[i][0] = new Pair();
    side[i][1] = new Pair();
    side[i][0].x=1000002;  //min
    side[i][0].y=1000002;
    side[i][1].x=-1;  //max
    side[i][1].y=-1;
   }
   for(int i=0;i!=k;++i){
    for(int j=0;j!=p;++j){
     inputX = scanner.nextInt();
     inputY = scanner.nextInt();
     
     if(side[i][0].x>inputX){
      side[i][0].x = inputX;
     }
     if(side[i][0].y>inputY){
      side[i][0].y = inputY;
     }
     //是否更换最大值
     if(side[i][1].x<inputX){
      side[i][1].x = inputX;
     }
     if(side[i][1].y<inputY){
      side[i][1].y = inputY;
     }
    }
    side[i][0].ch = side[i][1].ch=i;
   }
   //输入结束
   
   //排序
   sortX(side, k, 0);
   
   boolean split[][]=new boolean[27][27];   //true 表示有冲突
   
   for(int i=0;i!=k-1;++i){
    for(int j=i+1;j!=k;++j){
     if(side[j][0].x<=side[i][1].x){
      split[side[i][0].ch][side[j][0].ch]=true;
      split[side[j][0].ch][side[i][0].ch]=true;
     }else{
//      break;
     }
    }
   }
   sortY(side, k, 0);
   
   //中间斜线
   for(int i=0;i!=k;++i){
    split[i][i]=false;
   }
   for(int i=0;i!=k-1;++i){
    for(int j=i+1;j!=k;++j){
     if(side[j][0].y>side[i][1].y){
      split[side[i][0].ch][side[j][0].ch]=false;
      split[side[j][0].ch][side[i][0].ch]=false;
     }
    }
   }
   int result = 0;
   for(int i=0;i!=k-1;++i){
    for(int j=0;j!=k;++j){
     if(split[i][j]){
      result = 1;
      break ;
     }
    }
    if(result!=0){
     break;
    }
   }
   if(result==1){
    System.out.println("NO");
   }else{
    System.out.println("YES");
   }
  }
 }
 
 public static void sortX(Pair[][] p,int n,int type){
  for(int i=0;i!=n;++i){
   int index = i;
   for(int j=i+1;j!=n;++j){
    if(p[j][type].x<p[index][type].x){
     index = j;
    }
   }
   if(index!=i){
    Pair temp = p[index][0];
    p[index][0] = p[i][0];
    p[i][0] =temp;
    temp = p[index][1];
    p[index][1] = p[i][1];
    p[i][1] =temp;
   }
  }
 }
 /**
  * 
  * @param p
  * @param n
  * @param type
  */
 public static void sortY(Pair[][] p,int n,int type){
  for(int i=0;i!=n;++i){
   int index = i;
   for(int j=i+1;j!=n;++j){
    if(p[j][type].y<p[index][type].y){
     index = j;
    }
   }
   if(i!=index){
    Pair temp = p[index][0];
    p[index][0] = p[i][0];
    p[i][0] =temp;
    temp = p[index][1];
    p[index][1] = p[i][1];
    p[i][1] =temp;
   }
  }
 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值