标签:快速幂 namespace char getc 必须 names getch may als
一开始看不出来是快速幂矩阵的题目
先要把整个地图离散化为1,2,3,4,。。。。
连成一个有向图
邻接矩阵的平方意为:假如a->b 且b->c 那么一次平方后 a->c 相当于floyd路径的连通
所以p次方就是 该矩阵经过p次幂 如果路径为1 则代表可以走
离散化 i*m+j ; x*m+y i,j,x,y必须是基于0~n-1 标准的!
#include <iostream> #include <cstdio> #include<cstring> using namespace std; typedef long long ll; struct Matrix{ ll m[50][50]; }; int n,m; int siz; Matrix Mul(Matrix a, Matrix b) { Matrix c; memset(c.m, 0, sizeof(c.m)); for (int i = 0; i < siz; i++) { for (int j = 0; j < siz; j++) { for (int k = 0; k < siz; k++) { c.m[i][j] = (c.m[i][j] + (a.m[i][k] * b.m[k][j]) ) ; } } } return c; } Matrix fastm(Matrix a, ll num) { Matrix res; memset(res.m, 0, sizeof(res.m)); for(int i=0;i<siz;i++) res.m[i][i]=1; while (num) { if (num & 1) res = Mul(res, a); num >>= 1; a = Mul(a, a); } return res; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); getchar(); Matrix a; memset(a.m,0,sizeof(a.m)); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { int x1,y1,x2,y2,x3,y3,x4,y4; scanf("((%d,%d),(%d,%d),(%d,%d),(%d,%d))",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); getchar(); if(i==n-1&&j==m-1) continue;//到达结尾就结束 所以不处理 int now=i*m+j; a.m[now][(x1-1)*m+y1-1]=1; a.m[now][(x2-1)*m+y2-1]=1; a.m[now][(x3-1)*m+y3-1]=1; a.m[now][(x4-1)*m+y4-1]=1; } } siz=n*m; int Q; scanf("%d",&Q); while(Q--) { int p; scanf("%d",&p); Matrix res=fastm(a,p); int flag=0; if(res.m[0][siz-1]==0) printf("False\n"); else { for(int i=0;i<siz-1;i++) { if(res.m[0][i]){ flag=1; break; } } if(flag==1) printf("Maybe\n"); else printf("True\n"); } } printf("\n"); } return 0; }
标签:快速幂 namespace char getc 必须 names getch may als
原文地址:https://www.cnblogs.com/bxd123/p/10349969.html