ZOJ Problem Set - 3497 Mistwald
Chieh
posted @ 2015年8月25日 18:35
in NO Answer No Speak
, 358 阅读
/* Author:Chieh Because Of Coding */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #define LL long long #define INF 1e9 #define EPS 1e-9 using namespace std; struct matrix { int e[26][26]; }; matrix Cal(matrix p,matrix q,int len) { matrix c; for(int i=1; i<=len; i++) { for(int j=1; j<=len; j++) { c.e[i][j]=0; for(int k=1; k<=len; k++) { c.e[i][j]=c.e[i][j]+p.e[i][k]*q.e[k][j]; } c.e[i][j]=min(1,c.e[i][j]); } } return c; } int can[6][6]; int T; char ch[123]; int n,m; bool dist[30][30]; matrix s,a; void init() { memset(dist,0,sizeof(dist)); scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%s",ch+1); int u=can[i][j]; int len=strlen(ch+1); int o1=-1,o2=-1; for(int k=1; k<=len; k++) { if(ch[k]>='1'&&ch[k]<='5') { if(o1==-1)o1=ch[k]-'0'; else { o2=ch[k]-'0'; int v=can[o1][o2]; dist[u][v]=1; o1=-1; o2=-1; } } } } } } void exp_pow(int b) { while(b) { if(b&1)s=Cal(s,a,25); a=Cal(a,a,25); b>>=1; } } int ai[30]; int bi[30]; void play() { int q,t; scanf("%d",&q); while(q--) { scanf("%d",&t); for(int i=1; i<=25; i++) { for(int j=1; j<=25; j++) { a.e[i][j]=0; if(i==j)s.e[i][j]=1; else s.e[i][j]=0; if(i==can[n][m])continue; if(dist[i][j]==1) { a.e[i][j]=1; } } } exp_pow(t); int sum=0; bool flag=0; for(int j=1; j<=25; j++) { int tm=0; for(int k=1; k<=25; k++) { tm=tm+ai[k]*s.e[k][j]; } tm=min(tm,1); if(tm)sum++; if(j==can[n][m]&&tm)flag=1; } if(flag&&sum>1)printf("Maybe\n"); else if(flag&&sum==1)printf("True\n"); else printf("False\n"); } } int main() { memset(ai,0,sizeof(ai)); ai[1]=1; int st=0; for(int i=1; i<=5; i++) { for(int j=1; j<=5; j++) { can[i][j]=++st; } } scanf("%d",&T); while(T--) { init(); play(); printf("\n"); } // cout << "Hello world!" << endl; return 0; }