这道题如果不是刷矩阵专题,我肯定会把他搞成图论,但是学习了矩阵,对这种x步可以到达终点,或者从某地到某地X步有几条路。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
LL T,n,p,q,k,m;
struct matrix
{
LL arr[30][30];
} init;
matrix mul(matrix a,matrix b)
{
matrix c;
for(LL i=0; i<n*m; i++)
{
for(LL j=0; j<n*m; j++)
{
c.arr[i][j]=0;
for(LL k=0; k<n*m; k++)
{
if(a.arr[i][k]&&b.arr[k][j])
{
c.arr[i][j]=1;
}
}
}
}
return c;
}
matrix pow(matrix a, LL x)
{
matrix b;
for(LL i=0; i<n*m; i++)
for(LL j=0; j<n*m; j++)
{
if(i==j)
b.arr[i][j]=1;
else
b.arr[i][j]=0;
}
while(x)
{
if(x&1)
b=mul(a,b);
x>>=1;
a=mul(a,a);
}
return b;
}
LL x[5],y[5];
int main()
{
scanf("%d",&T);
while(T--)
{
memset(init.arr,0,sizeof(init.arr));
scanf("%lld %lld",&n,&m);
getchar();
for(LL i=0; i<n; i++)
for(LL j=0; j<m; j++)
{
scanf("((%lld,%lld),(%lld,%lld),(%lld,%lld),(%lld,%lld))",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2],&x[3],&y[3]);
if(i*m+j==n*m-1)continue;
for(int k=0; k<4; k++)
{
x[k]--;
y[k]--;
init.arr[i*m+j][x[k]*m+y[k]]=1;
}
getchar();
}
scanf("%lld",&p);
while(p--)
{
scanf("%lld",&q);
if(!q)
{
if(n*m==1)printf("True\n");
else printf("False\n");
continue;
}
LL ans = 0;
matrix res = pow(init,q);
// printf("%lld\n",res.arr[0][n*m-1]);
for(int i=0; i<n*m-1; i++)
{
if(res.arr[0][i])
ans++;
}
if(res.arr[0][n*m-1])
{
if(ans==0)
printf("True\n");
else printf("Maybe\n");
}
else printf("False\n");
}printf("\n");
}
return 0;
}