作者:小林2502927313 | 来源:互联网 | 2024-11-26 06:22
题目描述:在Berland有一位著名的占星师、魔术师和骗子——Cheaterius。他最近发明了一种能带来好运和财富的魔法符——Cheaterius符。这些符由Cheaterius亲自制作,其制作技术严格保密。每晚,Cheaterius都会将多米诺骨牌用强力胶粘合,制成2x2的正方形,即Cheaterius的魔法符。
Cheaterius是一位在Berland广为人知的占星家、魔法师和骗子。他的最新发明是Cheaterius魔法符!这些符咒据说能够带来好运和财富,但价格不菲。Cheaterius亲自制作这些符咒,制作技术对外严格保密。每晚,他都会将多米诺骨牌用强力胶粘合,形成2x2的正方形,这就是Cheaterius的魔法符。
![Cheaterius的一个魔法符](https://www.example.com/images/amulet.jpg)
经过一夜的辛勤工作,Cheaterius制作了n个符咒。每个符咒都是一个2x2的正方形,每个小方格内有1到6个点。现在,他想要将这些符咒分类堆放,每一堆都包含相同的符咒。两个符咒被认为是相同的,如果它们可以通过旋转90度、180度或270度使对应位置上的点数相同。不允许翻转符咒。
请编写一个程序,根据给定的符咒数量,计算出Cheaterius桌上需要多少堆符咒。
### 输入
第一行包含一个整数n(1 ≤ n ≤ 1000),表示符咒的数量。接下来n个符咒的描述,每个符咒的描述占据两行,每行包含两个数字(1到6)。每个符咒之间用一行“**”分隔。
### 输出
输出一个整数,表示所需的堆数。
### 示例
#### 输入
```
4
31
23
**
31
23
**
13
32
**
32
13
```
#### 输出
```
1
```
#### 输入
```
4
51
26
**
54
35
**
25
61
**
45
53
```
#### 输出
```
2
```
### 解题思路
每个2x2的符咒可以通过旋转显示4种不同的状态。为了判断两个符咒是否相同,可以将每个符咒的4种状态存储在一个数组中,然后进行比较。如果输入的符咒与已有的任何一种状态都不匹配,则将其视为新的类型。
### 参考代码
```cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define gm(a,b,c,d) (a*1000+b*100+c*10+d)
#define out {flag=0;break;}
using namespace std;
int mrk[1000];
int main()
{
int n; cin >> n;
int ans = 0;
memset(mrk, 0, sizeof mrk);
for (int ni = 0; ni {
int flag = 1;
int n1, n2; cin >> n1 >> n2;
int a = n1 / 10, b = n1 % 10;
int c = n2 / 10, d = n2 % 10;
string s; if (ni > s;
for (int i = 0; i {
if (gm(a, b, c, d) == mrk[i]) out // 1234
else if (gm(b, d, a, c) == mrk[i]) out // 2413
else if (gm(d, c, b, a) == mrk[i]) out // 4321
else if (gm(c, a, d, b) == mrk[i]) out // 3142
}
if (mrk[0] == 0 || flag) mrk[ans++] = gm(a, b, c, d);
}
cout < return 0;
}
```