1. 程式人生 > >C. Connect Three Round #528 (Div. 2)【曼哈頓距離】

C. Connect Three Round #528 (Div. 2)【曼哈頓距離】

一、題面

題目連結

二、分析

這題的關鍵是要確定一個點是從三個點出發的交匯點,其他的只要結合曼哈頓距離的定義即可明白。因為是三個點,這個交匯點的座標分別對應的就是x,y值的中值。然後一個小技巧就是曼哈頓距離的輸出,兩種情況對應兩種while迴圈,等於的情況剛好退出迴圈。

三、AC程式碼

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int X[4], Y[4];
 6 set<pair<int, int> > Ans;
 7 
 8 void Print(int
x, int y, int xt, int yt) 9 { 10 while(x < xt) 11 { 12 x++; 13 Ans.insert(make_pair(x, y)); 14 } 15 while(x > xt) 16 { 17 x--; 18 Ans.insert(make_pair(x, y)); 19 } 20 while(y > yt) 21 { 22 y--; 23 Ans.insert(make_pair(xt, y));
24 } 25 while(y < yt) 26 { 27 y++; 28 Ans.insert(make_pair(xt, y)); 29 } 30 } 31 32 int main() 33 { 34 //freopen("input.txt", "r", stdin); 35 while(scanf("%d %d", &X[0], &Y[0])!=EOF) 36 { 37 int ans; 38 int dx[4], dy[4]; 39 for
(int i = 1; i < 3; i++) 40 { 41 scanf("%d %d", &X[i], &Y[i]); 42 } 43 memcpy(dx, X, sizeof(X)); 44 memcpy(dy, Y, sizeof(Y)); 45 sort(dx, dx+3); 46 sort(dy, dy+3); 47 for(int i = 0; i < 3; i++) 48 { 49 Ans.insert(make_pair(X[i], Y[i])); 50 Print(X[i], Y[i], dx[1], dy[1]); 51 } 52 printf("%d\n", Ans.size()); 53 for(auto itr = Ans.begin(); itr != Ans.end(); itr++) 54 { 55 printf("%d %d\n", itr->first, itr->second); 56 } 57 } 58 return 0; 59 }
View Code