题意
有很多2X2的牌,四个块上都有写数字,将它们旋转90、180、270度,或者不变。所以一种牌可以显示出共4种状态。 给一堆牌,问总共有几种不同的牌。
思路
因为数字都是1~6.所以直接开一个四维数组,四重for循环也没有关系。
vis数组记录四次旋转的状态并记录。
最后四重for循环直接枚举。如果找到一个vis的值
>
0
>0
>0,首先答案+1.接着把此状态翻转后的四种状态的情况变成0.因为旋转后相同的只算一种。//
代码
比较简陋,但是易懂。
#include<bits/stdc++.h>
#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define ll long long
using namespace std;
const int N=1e5+10;
const int M=2023;
const int inf=0x3f3f3f3f;
int n;
char a,b,c,d;
int vis[7][7][7][7];
int ans;
int main()
{
cin>>n;
while(n--)
{
cin>>a>>b;
if(a==b and a=='*')
{
cin>>a>>b>>c>>d;
}
else
{
cin>>c>>d;
}
string x;
int aa=int(a)-48,bb=int(b)-48,cc=int(c)-48,dd=int(d)-48;
vis[aa][bb][cc][dd]++;
vis[cc][aa][dd][bb]++;
vis[dd][cc][bb][aa]++;
vis[bb][dd][aa][cc]++;
}
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
for(int k=1;k<=6;k++)
{
for(int f=1;f<=6;f++)
{
if(vis[i][j][k][f]>0)
{
ans++;
int aa=i,bb=j,cc=k,dd=f;
vis[aa][bb][cc][dd]=0;
vis[cc][aa][dd][bb]=0;
vis[dd][cc][bb][aa]=0;
vis[bb][dd][aa][cc]=0;
}
}
}
}
}
cout<<ans;
return 0;
}