KC看星(star)

D e s c r i p t i o n Description Description

“一闪一闪亮晶晶,满天都是小星星”

Kc吟唱着歌谣,躺在草坪上边想着她边看起了星星。Kc刚刚结识了笛卡尔这位好基友,认为他的坐标系非常神奇。于是他随机地选出了8颗星星,并且给它们标上了坐标。Kc又不甘寂寞,于是思考起一个问题:这八个点能否恰好构成一个正方形和一个矩形呢?

I n p u t Input Input

输入文件包括1行16个数,表示8个星星的坐标,坐标绝对值不超过10000。

O u t p u t Output Output

输出文件第一行是"YES"或者"NO"。表示是否有解。

若有解则第二行依次输出正方形每个顶点的序号。第三行依次输出矩形每个顶点的序号。序号即为输入的顺序。

另外注意:因为kc是一个刁端的人,所以他要求第二行和第三行这八个数要字典序最小。

四点共线不能认为是正方形或矩形

S a m p l e Sample Sample I n p u t Input Input
0 0 10 11 10 0 0 11 1 1 2 2 2 1 1 2
S a m p l e Sample Sample O u t p u t Output Output
 YES
5 6 7 8
1 2 3 4

T r a i n Train Train o f of of T h o u g h t Thought Thought

先将两个点的距离算出来
然后枚举8个点的顺序
然后判断就可以了

#include
#include
#include
#include
#include
using namespace std;

int dis[10][10], A[10], B[10], x[10], y[10];

void init()
{
	if(dis[A[1]][A[2]] != dis[A[2]][A[3]])return;
	if(dis[A[2]][A[3]] != dis[A[3]][A[4]])return;
	if(dis[A[3]][A[4]] != dis[A[1]][A[4]])return;
	if(dis[A[1]][A[3]] != dis[A[2]][A[4]])return;//判断是否为正方形
	
	if(dis[A[5]][A[6]] != dis[A[7]][A[8]])return;
	if(dis[A[5]][A[8]] != dis[A[6]][A[7]])return;
	if(dis[A[5]][A[7]] != dis[A[6]][A[8]])return;//判断是否为矩形
	
	sort(A + 1, A + 4 + 1);
	sort(A + 5, A + 8 + 1);//字典序排序
	
	printf("YES\n");
	for(int i = 1; i <= 4; ++i)
		printf("%d ", A[i]);
	printf("\n");
	for(int i = 5; i <= 8; ++i)
		printf("%d ", A[i]);
		
	exit(0);//退出整个程序
}

void Dfs(int k)//枚举顺序
{
	if(k > 8)
	{
		init();
		return;
	}
	for(int i = 1; i <= 8; ++i)
		if(!B[i])
		{
			B[i] = 1;
			A[k] = i;
			Dfs(k + 1);
			B[i] = 0;
		}
}

int main()
{
	for(int i = 1; i <= 8; i++)
		scanf("%d%d", &x[i], &y[i]);
	for(int i = 1; i <= 8; i++)
		for(int j = 1; j <= 8; j++)
			if(i != j)
				dis[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));//勾股
	Dfs(1);
	printf("NO");
	return 0;
}

你可能感兴趣的:(暴力,暴力)