zju 3497 Mistwald(矩陣乘法)

省賽的時候怪自己太弱,什麼都不會,而如今依然……

重操舊時廢業。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define M 26
struct matrix{
	bool a[M][M];
	int n;
//重載矩陣乘法運算符
    friend matrix operator* (matrix a,matrix b){
		matrix c;
		c.n=a.n;
		for(int i=0;i<a.n;i++){
			for(int j=0;j<a.n;j++){
				c.a[i][j]=false;
				for(int k=0;k<a.n;k++)
					c.a[i][j]|=(a.a[i][k]*b.a[k][j]);
			}
		}
		return c;
	}
};
matrix e;
//初始化單位矩陣
void Init(){
	memset(e.a,0,sizeof(e.a));
	for(int i=0;i<M;i++)
		e.a[i][i]=true;
}
//快速矩陣乘法
matrix Power(matrix a,int p){
	matrix b=e;
	b.n=a.n;
	for(;p;p>>=1,a=a*a){
		if(p&1)
			b=b*a;
	}
	return b;
}
int main(){
	Init();
	int t;
	scanf("%d",&t);
	while(t--){
		int h,w,i,j,k,s[8],n;
		char str[M*M];
		matrix ans;
		scanf("%d%d",&h,&w);
		ans.n=h*w;
		//  (1,1) -->(N,M) 即爲 0 ---> h*w-1 可達
		memset(ans.a,false,sizeof(ans.a));
		for(i=0;i<h;i++){
			for(j=0;j<w;j++){
				scanf("%s",str);
				sscanf(str,"((%d,%d),(%d,%d),(%d,%d),(%d,%d))",
					&s[0],&s[1],&s[2],&s[3],&s[4],&s[5],&s[6],&s[7]);
				for(k=0;k<8;k+=2)
					ans.a[w*i+j][(s[k]-1)*w+s[k+1]-1]=true;
			}
		}
		//因爲當到達最後一點時立即被傳送出去,所以,最後點所到之處全部置爲不可到達。
		for(i=0;i<ans.n;i++)
			ans.a[ans.n-1][i]=false;
		scanf("%d",&n);
		while(n--){
			int p;
			scanf("%d",&p);
			matrix res;
			res=Power(ans,p);
			if(!res.a[0][res.n-1]){ //如果最後一點不可到達,返回False
				puts("False");
				continue;
			}
			for(i=0;i<res.n;i++)
				if(res.a[0][i])
					break; 
				puts(res.n-1==i?"True":"Maybe"); 
/* 已經能夠達到,若僅有最後點能到,不能達到其它點,則一定True,
   否則就是可以到達其它點,Maybe。
*/
		}
		putchar('\n');
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章