整理房間-2019校招

題目描述
又到了週末,小易的房間亂得一團糟。
他希望將地上的雜物稍微整理下,使每團雜物看起來都緊湊一些,沒有那麼亂。
地上一共有n團雜物,每團雜物都包含4個物品。第i物品的座標用(ai,bi)表示,小易每次都可以將它繞着(xi,yi)逆時針旋轉90∘90^ \circ90∘,這將消耗他的一次移動次數。如果一團雜物的4個點構成了一個面積不爲0的正方形,我們說它是緊湊的。
因爲小易很懶,所以他希望你幫助他計算一下每團雜物最少需要多少步移動能使它變得緊湊。

輸入描述:
第一行一個數n(1 <= n <= 100),表示雜物的團數。
接下來4n行,每4行表示一團雜物,每行4個數ai, bi,xi, yi, (-104 <= xi, yi, ai, bi <= 104),表示第i個物品旋轉的它本身的座標和中心點座標。

輸出描述:
n行,每行1個數,表示最少移動次數。

示例1
輸入
4
1 1 0 0
-1 1 0 0
-1 1 0 0
1 -1 0 0
1 1 0 0
-2 1 0 0
-1 1 0 0
1 -1 0 0
1 1 0 0
-1 1 0 0
-1 1 0 0
-1 1 0 0
2 2 0 1
-1 0 0 -2
3 0 0 -2
-1 1 -2 0
輸出
1
-1
3
3
說明
對於第一團雜物,我們可以旋轉第二個或者第三個物品1次

解題思路:該題由於數據不大,採取枚舉的方式,對四個點依次做旋轉,逆時針旋轉公式可以參考下列鏈接
旋轉公式
由於只需要得到最小的旋轉步數,所以找到一個後就可以跳出循環了

#include<bits/stdc++.h>
using namespace std;
bool judge(int x[],int y[])
{
	bool rx = (x[0]^x[1]^x[2]^x[3]) == 0;
	bool ry = (y[0]^y[1]^y[2]^y[3]) == 0;
	if (!rx || !ry || rx && ry && (x[0] == x[1] && x[0] == x[2]) ||
                rx && ry && (y[0] == y[1] && y[0] == y[2])) return false;
    int dx = abs((x[0] - x[1]) != 0 ? (x[0] - x[1]) : (x[0] - x[2]));
    int dy = abs((y[0] - y[1]) != 0 ? (y[0] - y[1]) : (y[0] - y[2]));
    return dx == dy;
}
int main()
{
	int n;
	cin >> n;
	int data[4][4];
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < 4;j++)
		{
			for(int k = 0;k < 4;k++)
			{
				cin >> data[j][k];
			}
		}
		bool flag = false;
		int res = -1;
		for(int i1 = 0;i1 < 4;i1++)
		{
			int a1,b1;
			switch (i1)
			{
				case 0:
					a1 = data[0][0];
					b1 = data[0][1];
					break;
				case 1:
					a1 = data[0][2]+data[0][3]-data[0][1];
					b1 = data[0][3]+data[0][0]-data[0][2];
					break;
				case 2:
					a1 = data[0][2]*2-data[0][0];
					b1 = data[0][3]*2-data[0][1];
					break;
				case 3:
					a1 = data[0][2]+data[0][1]-data[0][3];
					b1 = data[0][3]+data[0][2]-data[0][0];
					break;
			}
			for(int i2 = 0;i2 < 4;i2++)
			{
				int a2,b2;
				switch (i2)
				{
					case 0:
						a2 = data[1][0];
						b2 = data[1][1];
						break;
					case 1:
						a2 = data[1][2]+data[1][3]-data[1][1];
						b2 = data[1][3]+data[1][0]-data[1][2];
						break;
					case 2:
						a2 = data[1][2]*2-data[1][0];
						b2 = data[1][3]*2-data[1][1];
						break;
					case 3:
						a2= data[1][2]+data[1][1]-data[1][3];
						b2 = data[1][3]+data[1][2]-data[1][0];
						break;
				}
				for(int i3 = 0;i3 < 4;i3++)
				{
					int a3,b3;
					switch (i3)
					{
						case 0:
							a3 = data[2][0];
							b3 = data[2][1];
							break;
						case 1:
							a3 = data[2][2]+data[2][3]-data[2][1];
							b3 = data[2][3]+data[2][0]-data[2][2];
							break;
						case 2:
							a3 = data[2][2]*2-data[2][0];
							b3 = data[2][3]*2-data[2][1];
							break;
						case 3:
							a3 = data[2][2]+data[2][1]-data[2][3];
							b3 = data[2][3]+data[2][2]-data[2][0];
							break;
					}
					for(int i4 = 0;i4 < 4;i4++)
					{
						int a4,b4;
						switch (i4)
						{
							case 0:
								a4 = data[3][0];
								b4 = data[3][1];
								break;
							case 1:
								a4 = data[3][2]+data[3][3]-data[3][1];
								b4 = data[3][3]+data[3][0]-data[3][2];
								break;
							case 2:
								a4 = data[3][2]*2-data[3][0];
								b4 = data[3][3]*2-data[3][1];
								break;
							case 3:
								a4 = data[3][2]+data[3][1]-data[3][3];
								b4 = data[3][3]+data[3][2]-data[3][0];
								break;
						}
						int x[4]={a1,a2,a3,a4};
						int y[4]={b1,b2,b3,b4};
						if(judge(x,y))
						{
							flag = true;
							res = i1+i2+i3+i4;
							/*for(int i6 = 0;i6 < 4;i6++)
							{
								cout << x[i6] << " ";
							}
							cout << endl;
							for(int i6 = 0;i6 < 4;i6++)
							{
								cout << y[i6] << " ";
							}
							cout << endl;
							cout << i1 << " " << i2 << " " << i3 << " " << i4 << endl;*/
							break;
						}
					}
					if(flag)break;
				}
				if(flag)break;
			}
			if(flag)break;
		}
		cout << res << endl;
	}
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章