zoukankan      html  css  js  c++  java
  • 矩阵判断几步后是否可以到达

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3497

    //最后判断从(1,1)开始如果走p步,只能到终点,则True
    //如果p步还可以到其他点,则Maybe
    //如果p步不能到终点,则False
    注意n==m==1的情况

    矩阵乘法每次乘都要将矩阵最后一行赋值0,因为到达终点了就不能在出来了

    View Code
    #include<stdio.h>
    #include<string.h>
    struct data
    {
        int map[30][30];
    };
    data res;
    
    int n,as[30],ha1[1000];
    int step=0;
    
    data mul(data a,data b)//矩阵乘
    {
        int i,j,k;
        data re;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                int all=0;
                for(k=0;k<n;k++)
                {
                    all+=(a.map[i][k]*b.map[k][j]);
                    
                }
                    if(all>=1)
                        all=1;
                re.map[i][j]=all;
            }
        }
        
        
        for(i=0;i<n;i++)
        re.map[n-1][i]=0;
    
        return re;
    }
    
    data mi(data f,int p)//矩阵求幂
    {
        int i,j;
        data all;
        
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                all.map[i][j]=0;
                if(i==j)all.map[i][j]=1;
            }
        }
    
        while(p>0)
        {
            if((p&1)==1)
            {all=mul(all,f);}
            
            f=mul(f,f);
            p>>=1;
        }
    
        return all;
    }
    int main()
    {
        int n1,m1,i,t,x1,x2,x3,x4,y1,y2,y3,y4,tt,j,k,q;
        data mm,mm1;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d %d",&n1,&m1);
            getchar();
            n=n1*m1;
            memset(mm.map,0,sizeof(mm.map));
            
            if(n1==1&&m1==1)//都为1的时候特殊考虑
            {
                scanf("%*s");
                scanf("%d",&q);
                
                int x=0;
                while(q--)
                {
                    scanf("%d",&x);
                    if(x==0)
                        printf("True\n");
                    else
                        printf("False\n");
                }
                printf("\n");
                continue;
            }
    
            int hang=0;
            for(i=0;i<n1;i++)
            {
                for(j=0;j<m1;j++)
                {
                    scanf("((%d,%d),(%d,%d),(%d,%d),(%d,%d))",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
                    getchar();
                    tt=(x1-1)*m1-1+y1;
                    mm.map[hang][tt]=1;
                    tt=(x2-1)*m1-1+y2;
                    mm.map[hang][tt]=1;
                    tt=(x3-1)*m1-1+y3;
                    mm.map[hang][tt]=1;
                    tt=(x4-1)*m1-1+y4;
                    mm.map[hang][tt]=1;
                    hang++;
                }
            }
            
            
            for(i=0;i<n;i++)
            {
                mm.map[n-1][i]=0;
            }
    
            
            scanf("%d",&q);
            while(q--)
            {
                scanf("%d",&x1);
    
                data temp=mi(mm,x1);
                if(temp.map[0][n-1]==0)
                {
                    printf("False\n");
                    continue;
                }
    
                int add=0;
                for(j=0;j<n;j++)
                {
                    add+=temp.map[0][j];
                }
                if(add==1)
                {
                    printf("True\n");
                }
                else
                {
                    printf("Maybe\n");
                }
    
                
            }printf("\n");
        }
        return 0;
    }



  • 相关阅读:
    linux find 命令用法
    在linux下使用libsvm
    利用merge sort寻找逆序对
    merge sort
    int与Integer的区别
    java 的回调函数
    weka的libsvm使用
    mysql 常用基准测试工具
    Drupal的taxonomy_manager模块合并分类的方法
    Sphinx数据源配置的一些注意点
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2439490.html
Copyright © 2011-2022 走看看