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

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;

}



你可能感兴趣的:(矩阵)