题意:
起点是(0,0),终点是(M,N)
从起点出发,走一条长度为P的路径,路径中间点不能
经过终点(但可以反复经过其他点)。
到终点也到其它点 Maybe
只能到达终点 True
起点是(0,0),终点是(M,N)
从起点出发,走一条长度为P的路径,路径中间点不能
经过终点(但可以反复经过其他点)。
到终点也到其它点 Maybe
只能到达终点 True
不能到达终点 False
/*//////////////////////////////
快速矩阵幂 ZOJ 3497
//////////////////////////////*/
#include <cstdio>
#include <cstring>
#include <cmath>
int p;
int x[10],y[10];
struct Matrix
{
int m[30][30];
void clear()
{
memset(m,0,sizeof(m));
}
}E, Z;
Matrix Mut(Matrix A, Matrix B)
{
Matrix ans;
for (int i = 0; i<p; i++)
for (int j = 0; j<p; j++)
{
ans.m[i][j] = 0;
for (int k = 0; k<p; k++)
{
//利用 | 求解是否可达
ans.m[i][j]=(ans.m[i][j]|
A.m[i][k]*B.m[k][j]);
}
}
return ans;
}
Matrix Pow(Matrix A, int b)
{
Matrix t = A, ans = E;
while (b)
{
if (b % 2)
ans = Mut(ans, t);
b /= 2;
t = Mut(t, t);
}
return ans;
}
int main()
{
// freopen("in.txt", "r", stdin);
Matrix A;
int t,n,m;
char str[200];
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
p=n*m;
A.clear();
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%s",str);
sscanf(str,"((%d,%d),(%d,%d),(%d,%d),(%d,%d))"
,&x[0],&y[0],&x[1],&y[1],&x[2],&y[2],&x[3],&y[3]);
for(int k=0;k<4;k++)
{
x[k]--;y[k]--;
A.m[i*m+j][m*x[k]+y[k]]=1;
}
}
//调成终点不能达到其它点
for(int i=0;i<p;i++)
A.m[p-1][i]=0;
int que,u,h;
scanf("%d",&que);
while(que--)
{
E=A;
scanf("%d",&u);
if(u==0)
{
if(p==1)
printf("True\n");
else
printf("False\n");
continue;
}
Matrix ans=Pow(E,u-1);
if(ans.m[0][p-1]==0)
printf("False\n");
else
{
for(h=0;h<p;h++)
if(ans.m[0][h]==1)
break;
if(h==p-1)
printf("True\n");
else
printf("Maybe\n");
}
}
printf("\n");
}
return 0;
}