Chieh's Blog

Because Of Coding

ZOJ Problem Set - 3497 Mistwald

Chieh posted @ 2015年8月25日 18:35 in NO Answer No Speak , 358 阅读
/*
Author:Chieh
Because Of Coding
*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#define LL long long
#define INF 1e9
#define EPS 1e-9
using namespace std;
struct matrix
{
    int e[26][26];
};
matrix Cal(matrix p,matrix q,int len)
{
    matrix c;
    for(int i=1; i<=len; i++)
    {
        for(int j=1; j<=len; j++)
        {
            c.e[i][j]=0;
            for(int k=1; k<=len; k++)
            {
                c.e[i][j]=c.e[i][j]+p.e[i][k]*q.e[k][j];
            }
            c.e[i][j]=min(1,c.e[i][j]);
        }
    }
    return c;
}
int can[6][6];
int T;
char ch[123];
int n,m;
bool dist[30][30];
matrix s,a;
void init()
{
    memset(dist,0,sizeof(dist));
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            scanf("%s",ch+1);
            int u=can[i][j];
            int len=strlen(ch+1);
            int o1=-1,o2=-1;
            for(int k=1; k<=len; k++)
            {
                if(ch[k]>='1'&&ch[k]<='5')
                {
                    if(o1==-1)o1=ch[k]-'0';
                    else
                    {
                        o2=ch[k]-'0';
                        int v=can[o1][o2];
                        dist[u][v]=1;
                        o1=-1;
                        o2=-1;
                    }
                }
            }
        }
    }

}
void exp_pow(int b)
{
    while(b)
    {
        if(b&1)s=Cal(s,a,25);
        a=Cal(a,a,25);
        b>>=1;
    }
}
int ai[30];
int bi[30];
void play()
{

    int q,t;
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d",&t);
        for(int i=1; i<=25; i++)
        {
            for(int j=1; j<=25; j++)
            {
                a.e[i][j]=0;
                if(i==j)s.e[i][j]=1;
                else s.e[i][j]=0;
                if(i==can[n][m])continue;
                if(dist[i][j]==1)
                {
                    a.e[i][j]=1;
                }
            }
        }
        exp_pow(t);
        int sum=0;
        bool flag=0;
        for(int j=1; j<=25; j++)
        {
            int tm=0;
            for(int k=1; k<=25; k++)
            {
                tm=tm+ai[k]*s.e[k][j];
            }
            tm=min(tm,1);
            if(tm)sum++;
            if(j==can[n][m]&&tm)flag=1;
        }
        if(flag&&sum>1)printf("Maybe\n");
        else if(flag&&sum==1)printf("True\n");
        else printf("False\n");
    }
}
int main()
{
    memset(ai,0,sizeof(ai));
    ai[1]=1;
    int st=0;

    for(int i=1; i<=5; i++)
    {
        for(int j=1; j<=5; j++)
        {
            can[i][j]=++st;
        }
    }
    scanf("%d",&T);
    while(T--)
    {
        init();
        play();
        printf("\n");
    }
    //  cout << "Hello world!" << endl;
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter