ZOJ 3497 Mistwald

来源:互联网 发布:x80锐途凯立德导航端口 编辑:程序博客网 时间:2024/06/11 00:42


题意:要从(1,1)走到(m,n),每格有四个出口,可以走向另外4个格子,现在告诉你走p步走到了(m,n)点,问是否是真的

分析:矩阵求p次幂,初始为单位矩阵,判断,(0,0)-(m,n)=0,输出false,(0,0)-其他点为1,输出maybe,否则输出true

题目中说名到了(m,n)点之后就不能再走 了,所以矩阵相乘的时候稍微处理一下



#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#define N 30using namespace std;int cnt;struct Matrix{    int m[N][N];}tmp,map;Matrix multiply(Matrix a,Matrix b){    Matrix ret;    int i,j,k;    for(i=0;i<cnt;i++){        for(j=0;j<cnt;j++){            ret.m[i][j]=0;            for(k=0;k<cnt-1;k++){  // 这里要注意                ret.m[i][j]=ret.m[i][j]|a.m[i][k]*b.m[k][j];            }        }    }    return ret;}void solve(int p){    Matrix ans;    int i,j;    memset(ans.m,0,sizeof(ans.m));    for(i=0;i<cnt;i++)    ans.m[i][i]=1;    for(i=0;i<cnt;i++)    for(j=0;j<cnt;j++)    tmp.m[i][j]=map.m[i][j];    while(p){        if(p&1)        ans=multiply(ans,tmp);        p>>=1;        tmp=multiply(tmp,tmp);    }    if(ans.m[0][cnt-1]==0){        printf("False\n");        return ;    }    for(i=0;i<cnt-1;i++){        if(ans.m[0][i]==1){            printf("Maybe\n");            return ;        }    }    printf("True\n");    return ;}int main(){    int t,i,j,k,x,y,l,n,m,p,q;    string str;    scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&m);        memset(map.m,0,sizeof(map.m));        for(i=0;i<n;i++){            for(j=0;j<m;j++){                cin>>str;                l=str.size();                for(k=2;k<l;k+=6){                    x=str[k]-'1';                    y=str[k+2]-'1';                    map.m[i*m+j][x*m+y]=1;                }            }        }        cnt=n*m;        scanf("%d",&q);        while(q--){            scanf("%d",&p);            solve(p);        }         printf("\n");    }    return 0;}


0 0
原创粉丝点击