--- title: "矩阵" created: 2025-11-28 tags: - 算法 --- # 矩阵 ## 题目 [矩阵](https://www.acwing.com/problem/content/description/4708/) ![[image-17fe539e.png]] ## 思路分析 又浅了一层 想着是把每个矩阵的4种情况全都存在哈希表里 key为各种情况 val标记它是哪个矩阵的 然后输入新的矩阵时 看是否出现过 如果出现过 看是否不属于同一个矩阵 不属于的话种类就++ 然后如果没出现过 就又把4种放进去 比较繁琐 这里可以借用最小表示法的思路 对于每个矩阵都处理出字典序最小的表示 把它存入hash表 这样就只需要用unordered\_set即可 最后看size即可 注意这个不是全排列问题 是旋转问题 我能想到的是转成一维 然后分别从0~3位置截取长度4 得到4中方式 ![[image-81a2c9f1.png]] y总的2维偏移量 有点懵 - [[二维矩阵旋转|二维矩阵旋转]] ## 代码实现 ```cpp #include using namespace std; unordered_set 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< using namespace std; unordered_set 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<