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; }