bzoj2973石头游戏——矩阵乘法

题目:权限题!

写了一下,但提交不了,先放着吧。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,num[10][10],ct,w[90],q,r,T;
char c[90][8];
struct Matrix{
    int a[90][90];
    Matrix operator * (const Matrix &y) const
    {
        Matrix x;
        memset(x.a,0,sizeof x.a);
        for(int i=1;i<=ct;i++)
            for(int k=1;k<=ct;k++)
                for(int j=1;j<=ct;j++)
                    x.a[i][j]+=a[i][k]*y.a[k][j];
        return x;
    }
}s[65],ans,ss,ss2;
void init()
{
    ans.a[1][0]=1;//ans使用第一行
    for(int t=1;t<=60;t++)
    {
        s[t].a[0][0]=1;//!
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                int k=num[i][j];
                char cc=c[k][w[k]];
                if(cc>='0'&&cc<='9')s[t].a[0][k]=cc-'0';
                if(cc=='N'&&i>1)s[t].a[k][num[i-1][j]]=1;
                if(cc=='W'&&j>1)s[t].a[k][num[i][j-1]]=1;
                if(cc=='S'&&i<n)s[t].a[k][num[i+1][j]]=1;
                if(cc=='E'&&j<m)s[t].a[k][num[i][j+1]]=1;
                if(w[k]==strlen(c[k])-1)w[k]=0;
                else w[k]++;
            }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&T);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            num[i][j]=++ct;
            cin>>c[ct];
        }
    init();
    q=T/60;r=T%60;
    if(q)
    {
        for(int i=0;i<=ct;i++)ss.a[i][i]=1;
        for(int i=1;i<=60;i++)
            ss=ss*s[i];
    }
    if(r)
    {
        for(int i=0;i<=ct;i++)ss2.a[i][i]=1;
        for(int i=1;i<=r;i++)
            ss2=ss2*s[i];
    }
    ans=ans*ss;
    ans=ans*ss2;
    int mx=0;
    for(int i=1;i<=ct;i++)
        mx=max(mx,ans.a[1][i]);
    printf("%d",mx);
    return 0;
}

 

posted @ 2018-05-16 23:57  Zinn  阅读(403)  评论(0编辑  收藏  举报