矩阵判断几步后是否可以到达

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;
}



原文地址:https://www.cnblogs.com/huhuuu/p/2439490.html