程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zoj-3497-Mistwald-矩陣

zoj-3497-Mistwald-矩陣

編輯:C++入門知識

題意:有一個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"<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved