http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3497.
按照规则处理一下建图即可,
然后就是一个最大25*25的矩阵快速幂了
#include<bits/stdc++.h>
using namespace std;
struct node{
int ma[33][33];
};
int s;
node mul(node a,node b)
{
node c;
memset(c.ma,0,sizeof(c.ma));
for(int i=0;i<s;i++)
{
for(int j=0;j<s;j++)
{
for(int k=0;k<s;k++)
{
c.ma[i][j]+=a.ma[i][k]*b.ma[k][j];
}
if(c.ma[i][j]>0)
c.ma[i][j]=1;
}
}
return c;
}
node qpow(node x,long long cs)
{
node ans;
for(int i=0;i<s;i++)
{
for(int j=0;j<s;j++)
ans.ma[i][j]=(i==j);
}
while(cs)
{
if(cs&1)
ans=mul(ans,x);
x=mul(x,x);
cs>>=1;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
node a;
memset(a.ma,0,sizeof(a.ma));
cin>>n>>m;
s=n*m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int s1,s2,s3,s4,s5,s6,s7,s8;
char l1,l2,l3;
cin>>l1>>l2;
cin>>s1>>l1>>s2;
cin>>l1>>l2>>l3;
cin>>s3>>l1>>s4;
cin>>l1>>l2>>l3;
cin>>s5>>l1>>s6;
cin>>l1>>l2>>l3;
cin>>s7>>l1>>s8;
cin>>l1>>l2;
//scanf("((%d,%d),(%d,%d),(%d,%d),(%d,%d))",&s1,&s2,&s3,&s4,&s5,&s6,&s7,&s8);
if(i==n-1&&j==m-1)continue;
a.ma[i*m+j][(s1-1)*m+s2-1]=1;
a.ma[i*m+j][(s3-1)*m+s4-1]=1;
a.ma[i*m+j][(s5-1)*m+s6-1]=1;
a.ma[i*m+j][(s7-1)*m+s8-1]=1;
}
}
int q;
cin>>q;
while(q--)
{
int k;
cin>>k;
node mb=qpow(a,k);
if(mb.ma[0][s-1]==0)
{
cout<<"False"<<endl;
}
else {
int f=1;
for(int i=1;i<s-1;i++)
{
if(mb.ma[0][i]!=0)
{
f=0;
cout<<"Maybe"<<endl;
break;
}
}
if(f==1)
{
cout<<"True"<<endl;
}
}
}
cout<<endl;
}
return 0;
}