1397. 尋找星座

1397. 尋找星座

題目描述
現在你在一張衛星圖片中尋找星座,已知該星座在圖片中正好出現一次,而且形狀一樣,方向一樣,大小也一樣。注意圖片中可能有一些與該星座無關的星星。

例如圖1中的星座出現在圖2的衛星圖片中(用圓圈標識部分)。圖1中給定的星座需要在X軸上平移2個單位同時在y軸上平移-3個單位才能與衛星圖片中的衛星正好吻合。 寫一個程序,計算給定星座的星星需要在X和Y方向上分別平移多少單位才能與衛星圖片吻合。
在這裏插入圖片描述
輸入
第1行:一個整數M,表示需要尋找的星座中星星的數量;

第2…M+1行:每行兩個用空格隔開的整數表示這M個星星的座標;

第M+2行:一個整數N,表示衛星圖片中星星的數量。

第M+3…M+N+2行:每行兩個整數表示圖片中星星的座標。 注意:星座和衛星圖片中任意兩個星星都不重疊;1<=M<=200,1<=N<=1000,X,Y座標值範圍爲0…1000000。

輸出
輸出一行,兩個用空格隔開的整數dx,dy,表示需要在X,Y方向上平移的單位。

樣例輸入
樣例輸入1:

5
8 5
6 4
4 3
7 10
0 10
10
10 5
2 7
9 7
8 10
10 2
1 2
8 1
6 7
6 0
0 9

樣例輸入2:

5
904207 809784
845370 244806
499091 59863
638406 182509
435076 362268
10
757559 866424
114810 239537
519926 989458
461089 424480
674361 448440
81851 150384
459107 795405
299682 6700
254125 362183
50795 541942

樣例輸出
樣例輸出1:

2 -3

樣例輸出2:

-384281 179674

思路:
我們先求出在星座中每兩個相鄰的星星的相對距離(dx[i],dy[i])。當然我們要對星座和衛星圖做一次排序(以x爲第一關鍵字(從小到大),以y爲第二關鍵字(從小到大))。

接下來我們枚舉衛星圖的每顆星星作爲星座第一顆,以dx[],dy[]作爲搜索條件,去判斷是否能找到一個相吻合的星座。在深搜的過程中,可以做一個剪枝:只要當前兩顆星星的相對的x距離大於dx[],跳出!

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e6;
struct node
{
	int x,y;
} p[1010],p1[1010];
int m,n,dx[1010],dy[1010];
bool cmp(node a,node b)
{
	if(a.x==b.x) return a.y<b.y;
	return a.x<b.x;
}
void dfs(int x,int y,int step,int sx,int sy,int st)
{
	if(step==m)
	{
		printf("%d %d\n",sx-p[1].x,sy-p[1].y);
		exit(0);	
	}
	for(int i=st;i<=n;i++)
	{
		if(p1[i].x-x==dx[step]&&p1[i].y-y==dy[step]) 
			dfs(p1[i].x,p1[i].y,step+1,sx,sy,i);
		if(p1[i].x-x>dx[step]) return;
	}
}
int main()
{
	//fre();
	scanf("%d",&m);
	for(int i=1;i<=m;i++) scanf("%d%d",&p[i].x,&p[i].y);
	sort(p+1,p+1+m,cmp);
	for(int i=2;i<=m;i++) 
		dx[i-1]=p[i].x-p[i-1].x,dy[i-1]=p[i].y-p[i-1].y;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&p1[i].x,&p1[i].y);
	sort(p1+1,p1+1+n,cmp);
	for(int i=1;i<=n;i++) dfs(p1[i].x,p1[i].y,1,p1[i].x,p1[i].y,i);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章