传送门

https://www.cnblogs.com/violet-acmer/p/10201535.html

 

题意:

  在二维空间中有 n 个 obelisk 点,n 个 p 点;

  存在坐标T(x,y),obelisk 中的每个点 o[ i ] : (x,y) 都可以在 p 中找到一个点 p[ j ] : (x,y) 使得 o[ i ].x + p[ j ].x == T.x , o[ i ].y + p[ j ].y == T.y ;

  求出这个T点坐标。

题解:

  我的做法--暴力枚举

  让 o[1]点与每个 p[ i ] 点结合,假设 T( o[ 1 ].x + p[ j ].x , o[ 1 ].y + p[ j ].y ) ; 

  判断其余的o点能否找到某个p点,使得其坐标和为T( ),如果全部找到,输出T点坐标,否则,枚举下一个点;

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 #define mem(a,b) memset(a,b,sizeof(a))
 7 const int maxn=1e3+10;
 8 
 9 int n;
10 struct Node
11 {
12     int x,y;
13 }o[maxn];
14 struct Node1
15 {
16     int x,y;
17 }p[maxn];
18 bool vis[maxn];
19 
20 bool cmp(Node1 _a,Node1 _b)
21 {
22     return _a.x < _b.x;
23 }
24 bool Find(int x,int y)//判断p中有无点(x,y)
25 {
26     for(int i=1;i <= n;++i)
27         if(p[i].x == x && p[i].y == y)
28             return true;
29     return false;
30 }
31 void Solve()
32 {
33     sort(p+1,p+n+1,cmp);
34     for(int i=1;i <= n;++i)
35     {
36         int tX=o[1].x+p[i].x;
37         int tY=o[1].y+p[i].y;
38         bool flag=false;
39         for(int j=2;j <= n;++j)
40             if(!Find(tX-o[j].x,tY-o[j].y))
41                 flag=true;
42 
43         if(!flag)
44         {
45             printf("%d %d\n",tX,tY);
46             return ;
47         }
48     }
49 }
50 int main()
51 {
52     scanf("%d",&n);
53     for(int i=1;i <= n;++i)
54         scanf("%d%d",&o[i].x,&o[i].y);
55     for(int i=1;i <= n;++i)
56         scanf("%d%d",&p[i].x,&p[i].y);
57     Solve();
58     return 0;
59 }
枚举

相关文章:

  • 2021-05-24
  • 2021-12-29
  • 2021-11-01
  • 2021-12-30
  • 2022-12-23
  • 2021-10-10
  • 2021-09-07
  • 2021-12-02
猜你喜欢
  • 2021-10-31
  • 2021-09-01
  • 2021-09-13
  • 2021-06-13
  • 2021-08-17
  • 2022-12-23
  • 2021-06-21
相关资源
相似解决方案