现在的位置: 首页 > 综合 > 正文

HDU 2371 用矩阵置换字符

2019年02月09日 ⁄ 综合 ⁄ 共 1160字 ⁄ 字号 评论关闭

先给出Matrix67 大神给出的十种矩阵使用的例子

http://www.matrix67.com/blog/archives/276

HDU 2371 给出一个字符串和置换方法以及置换次数  求最后得到的字符串

矩阵乘法水之

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
 
#define MAXN 100
 
using namespace std;
 
struct Matrix
{
    int size;
    int element[MAXN][MAXN];
    void setSize(int);
    Matrix operator* (Matrix);
    Matrix power(int);
};
 
void Matrix::setSize(int a)
{
    for (int i=0; i<a; i++)
        for (int j=0; j<a; j++)
            element[i][j]=0;
    size = a;
}
 
Matrix Matrix::operator* (Matrix param)
{
    Matrix product;
    product.setSize(size);
    for (int i=0; i<size; i++)
        for (int j=0; j<size; j++)
            for (int k=0; k<size; k++)
                product.element[i][j]+=element[i][k]*param.element[k][j];
    return product;
}
 
Matrix Matrix::power(int exp)
{
    Matrix res,A;
    A=*this;
    res.setSize(size);
    for(int i=0;i<size;i++)
        res.element[i][i]=1;
    while(exp)
    {
        if(exp&1)
            res=res*A;
        exp>>=1;
        A=A*A;
    }
    return res;
}
 
char str[100];
int n,m;
int squ[100],tsqu[100];
Matrix a;
 
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0 && m==0)break;
        a.setSize(n);
        for(int i=0;i<n;i++)
        {
            int tmp;
            squ[i]=i;
            scanf("%d",&tmp);
            a.element[tmp-1][i]=1;
        }
        a=a.power(m);
        gets(str);
        gets(str);
        for(int i=0;i<n;i++)
        {
            int tmp=0;
            for(int j=0;j<n;j++)
                tmp+=a.element[i][j]*squ[j];
            tsqu[i]=tmp;
        }
        for(int i=0;i<n;i++)
            printf("%c",str[tsqu[i]]);
        printf("\n");
    }
    return 0;
}

抱歉!评论已关闭.