題意:有一個n*m的矩陣,矩陣上每一個格子有四個傳送門,分別通向四個格子,題目給出了每個格子的四個傳送門所能到達的地方。起點在(1,1),終點是(n,m),當走到終點的時候就不能再走了,也就是說一旦你到達了終點,就會直接離開這個矩陣。問說從起點開始走P(0 ≤ P ≤ 100,000,000)步能不能到達終點。
輸出的情況是True,Maybe和False。Ture對應的就是走了P步以後只能到達一個點,就是終點。Maybe對應的是走了P步之後還可以到達除了終點以外的其他點。False對應的是P步以後無法到達終點。
做法:
對矩陣做P次冪,如果可達,那麼對應位置應該不為0;
注意:
因為走到(n,m)點之後就不能再走了,所以要把所有的有關於最後一個點的邊去掉。
can[i]:第i個點可以一步走到最後一個點。
yes[i]:第i個點可以一步走到非最後一個點
我們可以對矩陣做p-1次冪,然後模擬最後一步。
#include#include #include #include using namespace std; #define LL long long #define MOD 1000000007 struct matrix { int mat[31][31]; matrix(){memset(mat,0,sizeof(mat));} }ONE; int n; int can[101]; int yes[101]; matrix mul(matrix A,matrix B) { matrix C; int i,j,k; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { for(k=1;k<=n;k++) { C.mat[i][j]=C.mat[i][j]|(A.mat[i][k]&B.mat[k][j]); } } } return C; } matrix powmul(matrix A,LL k) { matrix B; for(int i=1;i<=n;i++)B.mat[i][i]=1; while(k) { if(k&1)B=mul(B,A); A=mul(A,A); k>>=1; } return B; } void pan(matrix A) { int leap1=0; int leap2=0; for(int i=1;i ='0'&&str[k]<='9') { ls++; if(ls%2) { b=str[k]-'0'; if(i==nn&&j==mm)continue; if(a==nn&&b==mm){ can[(i-1)*mm+j]=1; continue; } A.mat[(i-1)*mm+j][(a-1)*mm+b]=1; yes[(i-1)*mm+j]=1; } else a=str[k]-'0'; } } } } matrix B; int Q; LL kk; scanf("%d",&Q); while(Q--) { scanf("%lld",&kk); if(kk==0) { if(nn==1&&mm==1) { cout<<"True"<