矩阵

题目 矩阵

image-17fe539e

思路分析

又浅了一层

想着是把每个矩阵的4种情况全都存在哈希表里 key为各种情况 val标记它是哪个矩阵的

然后输入新的矩阵时 看是否出现过 如果出现过 看是否不属于同一个矩阵 不属于的话种类就++ 然后如果没出现过 就又把4种放进去 比较繁琐

这里可以借用最小表示法的思路

对于每个矩阵都处理出字典序最小的表示 把它存入hash表 这样就只需要用unordered_set即可 最后看size即可

注意这个不是全排列问题 是旋转问题

我能想到的是转成一维 然后分别从0~3位置截取长度4 得到4中方式

image-81a2c9f1

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;

}

同类题型

视频讲解


⬅️ 相等的和 🏠 00-刷题理模型 ➡️ 二维矩阵旋转