省賽的時候怪自己太弱,什麼都不會,而如今依然……
重操舊時廢業。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define M 26
struct matrix{
bool a[M][M];
int n;
//重載矩陣乘法運算符
friend matrix operator* (matrix a,matrix b){
matrix c;
c.n=a.n;
for(int i=0;i<a.n;i++){
for(int j=0;j<a.n;j++){
c.a[i][j]=false;
for(int k=0;k<a.n;k++)
c.a[i][j]|=(a.a[i][k]*b.a[k][j]);
}
}
return c;
}
};
matrix e;
//初始化單位矩陣
void Init(){
memset(e.a,0,sizeof(e.a));
for(int i=0;i<M;i++)
e.a[i][i]=true;
}
//快速矩陣乘法
matrix Power(matrix a,int p){
matrix b=e;
b.n=a.n;
for(;p;p>>=1,a=a*a){
if(p&1)
b=b*a;
}
return b;
}
int main(){
Init();
int t;
scanf("%d",&t);
while(t--){
int h,w,i,j,k,s[8],n;
char str[M*M];
matrix ans;
scanf("%d%d",&h,&w);
ans.n=h*w;
// (1,1) -->(N,M) 即爲 0 ---> h*w-1 可達
memset(ans.a,false,sizeof(ans.a));
for(i=0;i<h;i++){
for(j=0;j<w;j++){
scanf("%s",str);
sscanf(str,"((%d,%d),(%d,%d),(%d,%d),(%d,%d))",
&s[0],&s[1],&s[2],&s[3],&s[4],&s[5],&s[6],&s[7]);
for(k=0;k<8;k+=2)
ans.a[w*i+j][(s[k]-1)*w+s[k+1]-1]=true;
}
}
//因爲當到達最後一點時立即被傳送出去,所以,最後點所到之處全部置爲不可到達。
for(i=0;i<ans.n;i++)
ans.a[ans.n-1][i]=false;
scanf("%d",&n);
while(n--){
int p;
scanf("%d",&p);
matrix res;
res=Power(ans,p);
if(!res.a[0][res.n-1]){ //如果最後一點不可到達,返回False
puts("False");
continue;
}
for(i=0;i<res.n;i++)
if(res.a[0][i])
break;
puts(res.n-1==i?"True":"Maybe");
/* 已經能夠達到,若僅有最後點能到,不能達到其它點,則一定True,
否則就是可以到達其它點,Maybe。
*/
}
putchar('\n');
}
return 0;
}