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
", Ans.size());
53         for(auto itr = Ans.begin(); itr != Ans.end(); itr++)
54         {
55             printf("%d %d
", itr->first, itr->second);
56         }
57     }
58     return 0;
59 }
View Code
原文地址:https://www.cnblogs.com/dybala21/p/10171230.html