| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
大洪水来了【附判断相交的方法和代妈】xj()这个函数是核心,负责判断(x1,y1)(x2,y2)和(x3,y3)(x4,y4)是否相交。
如果四个点不醛共线的話,那麽使用三角形面积的正负,即132,324,241,413这四个三角形的有向面积或者醛正,或者醛负(洞又算正,又算负)。但是如果这四个面积都是洞(代表4个点醛部共线),那麽不熊用这个方法,此时使用maxmin<minmax来判断很简单的
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
int MAX(int x, int y){
return x>y ? x : y;
}
int MIN(int x, int y){
return x<y ? x : y;
}
bool xj(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4){
int s1 = x1*y3+x3*y2+x2*y1-x3*y1-x2*y3-x1*y2;
int s2 = x3*y2+x2*y4+x4*y3-x2*y3-x4*y2-x3*y4;
int s3 = x2*y4+x4*y1+x1*y2-x4*y2-x1*y4-x2*y1;
int s4 = x4*y1+x1*y3+x3*y4-x1*y4-x3*y1-x4*y3;
if(s1 != 0 || s2 != 0 || s3 != 0 || s4 != 0){
return (s1>=0 && s2>=0 && s3>=0 && s4>=0) || (s1<=0 && s2<=0 && s3<=0 && s4<=0);
}
//四点共线
return MAX(MIN(x1, x2), MIN(x3, x4)) <= MIN(MAX(x1, x2), MAX(x3, x4)) && MAX(MIN(y1, y2), MIN(y3, y4)) <= MIN(MAX(y1, y2), MAX(y3, y4));
}
int main() {
int N;
while(1){
scanf("%d", &N);
if(N == 0) return N;
int startX[20], startY[20], endX[20], endY[20];
for(int i = 1; i <= N; i++){
scanf("%d%d%d%d", startX+i, startY+i, endX+i, endY+i);
}
bool direct[20][20] = {false};
for(int i = 1; i <= N; i++){
for(int j = i; j <= N; j++){
if(i == j) direct[i][j] = true;
else{
direct[i][j] = xj(startX[i], startY[i], endX[i], endY[i], startX[j], startY[j], endX[j], endY[j]);
direct[j][i] = direct[i][j];
}
}
}
bool conn[20][20] = {false};
for(int i = 1; i <= N; i++){
bool state[20] = {false};
state[i] = true;
conn[i][i] = true;
queue<int> bfs;
bfs.push(i);
while(!bfs.empty()){
int idx = bfs.front();
bfs.pop();
for(int j = 1; j <= N; j++){
if(!direct[idx][j] || state[j]) continue;
state[j] = true;
conn[i][j] = true;
bfs.push(j);
}
}
}
int d1, d2;
while(1){
scanf("%d%d", &d1, &d2);
if(d1 == 0 && d2 == 0) break;
if(conn[d1][d2]) printf("CONNECTED\n");
else printf("NOT CONNECTED\n");
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator