热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

A.Cheaterius的魔法符问题

题目描述:在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;
}
```

推荐阅读
author-avatar
小林2502927313
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有