题意:要从(1,1)走到(m,n),每格有四个出口,可以走向另外4个格子,现在告诉你走p步走到了(m,n)点,问是否是真的
分析:矩阵求p次幂,初始为单位矩阵,判断,(0,0)-(m,n)=0,输出false,(0,0)-其他点为1,输出maybe,否则输出true
题目中说名到了(m,n)点之后就不能再走 了,所以矩阵相乘的时候稍微处理一下
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define N 30
using namespace std;
int cnt;
struct Matrix{
int m[N][N];
}tmp,map;
Matrix multiply(Matrix a,Matrix b){
Matrix ret;
int i,j,k;
for(i=0;i<cnt;i++){
for(j=0;j<cnt;j++){
ret.m[i][j]=0;
for(k=0;k<cnt-1;k++){ // 这里要注意
ret.m[i][j]=ret.m[i][j]|a.m[i][k]*b.m[k][j];
}
}
}
return ret;
}
void solve(int p){
Matrix ans;
int i,j;
memset(ans.m,0,sizeof(ans.m));
for(i=0;i<cnt;i++)
ans.m[i][i]=1;
for(i=0;i<cnt;i++)
for(j=0;j<cnt;j++)
tmp.m[i][j]=map.m[i][j];
while(p){
if(p&1)
ans=multiply(ans,tmp);
p>>=1;
tmp=multiply(tmp,tmp);
}
if(ans.m[0][cnt-1]==0){
printf("False\n");
return ;
}
for(i=0;i<cnt-1;i++){
if(ans.m[0][i]==1){
printf("Maybe\n");
return ;
}
}
printf("True\n");
return ;
}
int main(){
int t,i,j,k,x,y,l,n,m,p,q;
string str;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(map.m,0,sizeof(map.m));
for(i=0;i<n;i++){
for(j=0;j<m;j++){
cin>>str;
l=str.size();
for(k=2;k<l;k+=6){
x=str[k]-'1';
y=str[k+2]-'1';
map.m[i*m+j][x*m+y]=1;
}
}
}
cnt=n*m;
scanf("%d",&q);
while(q--){
scanf("%d",&p);
solve(p);
}
printf("\n");
}
return 0;
}