矩阵
题目 矩阵
思路分析
又浅了一层
想着是把每个矩阵的4种情况全都存在哈希表里 key为各种情况 val标记它是哪个矩阵的
然后输入新的矩阵时 看是否出现过 如果出现过 看是否不属于同一个矩阵 不属于的话种类就++ 然后如果没出现过 就又把4种放进去 比较繁琐
这里可以借用最小表示法的思路
对于每个矩阵都处理出字典序最小的表示 把它存入hash表 这样就只需要用unordered_set即可 最后看size即可
注意这个不是全排列问题 是旋转问题
我能想到的是转成一维 然后分别从0~3位置截取长度4 得到4中方式
y总的2维偏移量 有点懵
代码实现
#include<bits/stdc++.h>
using namespace std;
unordered_set<string> h;
int n;
int main()
{
cin>>n;
while(n--){
string g[3],str;
cin>>g[0]>>g[1]>>g[2];
reverse(g[1].begin(),g[1].end());
str=g[0]+g[1];
str+=str;
string s[4];
for(int i=0;i<4;i++)
s[i]=str.substr(i,4);
sort(s,s+4);
h.insert(s[0]);
}
cout<<h.size()<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
unordered_set<string> h;
int n;
int main()
{
cin>>n;
while(n--){
string g[3],str;
cin>>g[0]>>g[1]>>g[2];
int dx[]={0,0,1,1},dy[]={0,1,1,0};
string s[4];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
int k=(i+j)%4;
s[i]+=g[dx[k]][dy[k]];
}
}
sort(s,s+4);
h.insert(s[0]);
}
cout<<h.size()<<endl;
return 0;
}
💬 评论