美文网首页
矩阵快速幂

矩阵快速幂

作者: moosoo | 来源:发表于2016-07-16 09:21 被阅读25次

zoj 3497 Mistwald
矩阵乘法,但是要先把点从二维变成一维,然后要特殊处理一下终点情况,走到终点就不能再走了。

#include <iostream>  
#include <cstdio>  
#include <cstring>  
using namespace std;  
int mat[30][30], g[30][30], res[30][30];  
int m, n, nm;  
void MatPow(int m1[][30],int m2[][30]){
    int t[30][30];
    for(int i=0;i<nm-1;i++){
        for(int j=0;j<nm;j++){
            t[i][j]=0;
            /*看这里*/
            for(int k=0;k<nm-1;k++){
                if(m1[i][k]&&m2[k][j]){
                    t[i][j]=1;
                    break;
                }
            }
        }
    }
    memcpy(m1,t,sizeof(t));
}

int main(){
    int T;
    int Q,p;
    cin>>T;
    char s[100];
    int X[5],Y[5];
    while(T--){
        cin>>m>>n;
        nm=n*m;
        memset(mat,0,sizeof(mat));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                scanf("%s",s);
                sscanf(s, "((%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]--;
                    /*看这里*/
                    mat[i*n+j][X[k]*n+Y[k]]=1;
                }
            }
        }
        cin>>Q;
        while(Q--){
            cin>>p;
            if(!p){
                if(nm==1) cout<<"True\\\\n";
                else  cout<<"False\\\\n";
                continue;
            }
            bool ok=true;
            memcpy(g,mat,sizeof(g));
            while(p){
                if(p&1){
                    if(ok){
                        memcpy(res,g,sizeof(g));
                        ok=false;
                    }
                    else 
                        MatPow(res,g);
                }
                p>>=1;
                MatPow(g,g);
            }
            int ans=0;
            for(int i=0;i<nm-1;i++){
                if(res[0][i]){
                    ans++;
                }
            }
            if(res[0][nm-1]){
                if(ans==0)
                    cout<<"True\\\\n";
                else
                    cout<<"Maybe\\\\n";
            }
            else
                cout<<"False\\\\n";
        }
        cout<<endl;
    }
    return 0;
}

相关文章

  • (矩阵)快速幂

    快速乘法: 快速幂: 矩阵快速幂:

  • 快速幂,矩阵快速幂

    快速幂:复杂度为logn,比普通的n快了很多了. 原理 : 实现代码如下:(位运算,简单,简洁) 矩阵快速幂: 所...

  • 2018-07-09-快速幂

    参考:算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现 - CSDN博客

  • 矩阵快速幂

    zoj 3497 Mistwald矩阵乘法,但是要先把点从二维变成一维,然后要特殊处理一下终点情况,走到终点就不...

  • 2018-10-07-HDOJ-5950

    题目:HDOJ-5950一道矩阵快速幂经典题。

  • Codeforces Round #420 (Div. 2) E

    这个题很劲的,先贴代码,具体想法过程,一会再来写用矩阵快速幂去实现了一个寻找最优解的过程矩阵快速幂和dp的原理其实...

  • 矩阵快速幂——实战

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,at...

  • 矩阵快速幂——入门

    题目链接POJ307 题意:求第n位斐波那契数mod 10000的大小。其中n的大小高达1000000000 由于...

  • 矩阵快速幂——进阶

    上一篇文章讲解了下基于斐波那契数列的矩阵快速幂,即F(n) = F(n-1) + F(n-2),转移矩阵比较简单。...

  • 数学---矩阵快速幂

    hdu6470,斐波那契,矩阵快速幂,递推 解决哪些问题 求解一些递推公式的第n项的时候,通过递推公式构造转移矩阵...

网友评论

      本文标题:矩阵快速幂

      本文链接:https://www.haomeiwen.com/subject/vnlxrttx.html