链接:https://ac.nowcoder.com/acm/contest/1221/D
来源:牛客网
题目描述
Forsaken特别喜欢正方形,现在他有二维平面的四个整点。如果四个整点可以直接形成一个正方形,输出"wen"。如果可以通过对其中一个点进行一次轻微的调整使得四个整点形成一个正方形,输出“hai xing”,轻微的调整是指如果当前整点坐标为(x,y)(x,y)(x,y),那么我们可以把这个点变成(x+1,y),(x−1,y),(x,y+1),(x,y−1)(x+1,y),(x-1,y),(x,y+1),(x,y-1)(x+1,y),(x−1,y),(x,y+1),(x,y−1)中的一种。否则如果都不行,输出“wo jue de bu xing”。
输入描述:
输入有四行,每行一个二维坐标(x,y)(x,y)(x,y)
输出描述:
按题面给定输出。
这个题目当时做的时候就觉得是一个依此判断是不是可行,由于当时第一时间没什么思路,就去写我们网络编程去了(每次都是上着实验课做题,杨老师sorry~)
但是后续给出的题解以及别人过的代码来看,当时应该还是有很多没想到的东西
对于第一种情况,只需要会判断4个点能否构成正方形即可。
对于第二种情况,只需要枚举四个点,然后依次判断移动后能否构成正方形。
前两种都不行就是第三种
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int x[5],y[5],v[50];
int xa[4] = {0, 0, -1, 1};
int ya[4] = {1, -1, 0, 0};
int check()
{
int w = 0;
for (int i=1; i<=4; i++)
for (int j=i+1; j<=4; j++)
v[++w] = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
if (v[1]==v[6]&&v[2]==v[5]&&v[3]==v[4])
return 1;
return 0;
}
int main()
{
int i, j;
for(i=1; i<=4; i++)
cin >> x[i] >> y[i];
if (check())
{
printf("wen\n");
return 0;
}
else
{
for (i=1; i<=4; i++)
{
for (j=0; j<4; j++)
{
x[i]+=xa[j];
y[i] += ya[j];
if (check())
{
printf("hai xing\n");
return 0;
}
x[i]-=xa[j];
y[i]-= ya[j];
}
}
}
printf("wo jue de bu xing\n");
return 0;
}