http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3497
//最后判断从(1,1)开始如果走p步,只能到终点,则True
//如果p步还可以到其他点,则Maybe
//如果p步不能到终点,则False
注意n==m==1的情况
矩阵乘法每次乘都要将矩阵最后一行赋值0,因为到达终点了就不能在出来了
#include<stdio.h> #include<string.h> struct data { int map[30][30]; }; data res; int n,as[30],ha1[1000]; int step=0; data mul(data a,data b)//矩阵乘 { int i,j,k; data re; for(i=0;i<n;i++) { for(j=0;j<n;j++) { int all=0; for(k=0;k<n;k++) { all+=(a.map[i][k]*b.map[k][j]); } if(all>=1) all=1; re.map[i][j]=all; } } for(i=0;i<n;i++) re.map[n-1][i]=0; return re; } data mi(data f,int p)//矩阵求幂 { int i,j; data all; for(i=0;i<n;i++){ for(j=0;j<n;j++){ all.map[i][j]=0; if(i==j)all.map[i][j]=1; } } while(p>0) { if((p&1)==1) {all=mul(all,f);} f=mul(f,f); p>>=1; } return all; } int main() { int n1,m1,i,t,x1,x2,x3,x4,y1,y2,y3,y4,tt,j,k,q; data mm,mm1; scanf("%d",&t); while(t--) { scanf("%d %d",&n1,&m1); getchar(); n=n1*m1; memset(mm.map,0,sizeof(mm.map)); if(n1==1&&m1==1)//都为1的时候特殊考虑 { scanf("%*s"); scanf("%d",&q); int x=0; while(q--) { scanf("%d",&x); if(x==0) printf("True\n"); else printf("False\n"); } printf("\n"); continue; } int hang=0; for(i=0;i<n1;i++) { for(j=0;j<m1;j++) { scanf("((%d,%d),(%d,%d),(%d,%d),(%d,%d))",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); getchar(); tt=(x1-1)*m1-1+y1; mm.map[hang][tt]=1; tt=(x2-1)*m1-1+y2; mm.map[hang][tt]=1; tt=(x3-1)*m1-1+y3; mm.map[hang][tt]=1; tt=(x4-1)*m1-1+y4; mm.map[hang][tt]=1; hang++; } } for(i=0;i<n;i++) { mm.map[n-1][i]=0; } scanf("%d",&q); while(q--) { scanf("%d",&x1); data temp=mi(mm,x1); if(temp.map[0][n-1]==0) { printf("False\n"); continue; } int add=0; for(j=0;j<n;j++) { add+=temp.map[0][j]; } if(add==1) { printf("True\n"); } else { printf("Maybe\n"); } }printf("\n"); } return 0; }