zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    svg入门
    常用颜色对照表
    字节序
    eclipse常用快捷键
    jenkins 安装
    redis
    Linux
    jenkins
    jenkins
    jenkins- 自动部署java包至远程服务器
  • 原文地址:https://www.cnblogs.com/bxd123/p/10349969.html
Copyright © 2011-2022 走看看