快速矩阵幂ZOJ3497

来源:互联网 发布:excel从网页导入数据 编辑:程序博客网 时间:2024/06/05 23:56
题意:
起点是(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;}


0 0
原创粉丝点击