Mistwald POJ

一开始看不出来是快速幂矩阵的题目

先要把整个地图离散化为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
");
            else
            {
                for(int i=0;i<siz-1;i++)
                {
                    if(res.m[0][i]){
                        flag=1;
                        break;
                    }
                }
                if(flag==1) printf("Maybe
");
                else    printf("True
");
            }
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/bxd123/p/10349969.html