题意:给两个n行m列的矩阵a和b,计数器 ,只有当计数器的值模(p-1)时出口才打开,要从左上走到右下,求最快多久走出迷宫。
,只有当计数器的值模(p-1)时出口才打开,要从左上走到右下,求最快多久走出迷宫。
分析:无论2的bij次方有多大p的2的bij次方的次方取模(p-1)都为1,所以cij=aij。用bfs搜索最短路径
代码:
#include<bits/stdc++.h>
 using namespace std;
 struct A{
     int x,y,pp;
 };
 int dx[4]{-1,1,0,0},dy[4]={0,0,-1,1};
 int main(){
     int n,m,p;cin>>n>>m>>p;p--;
     int a[n+10][m+10],b[n+10][m+10];
     for(int i=1;i<=n;i++){
         for(int j=1;j<=m;j++){
             cin>>a[i][j];
         }
     }
     for(int i=1;i<=n;i++){
         for(int j=1;j<=m;j++){
             cin>>b[i][j];
         }
     }
     int dp[15][15][10100],vis[15][15][10100];
     vis[1][1][a[1][1]%p]=1;
     dp[1][1][a[1][1]%p]=0;
     queue<A>pru;
     pru.push({1,1,a[1][1]%p});
     while(!pru.empty()){
         auto u=pru.front();
         pru.pop();
         for(int i=0;i<=3;i++){
             int tx=u.x+dx[i],ty=u.y+dy[i],tp=(u.pp+a[tx][ty])%p;
             if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty][tp]){
                 vis[tx][ty][tp]=1;
                 dp[tx][ty][tp]=dp[u.x][u.y][u.pp]+1;
                 pru.push({tx,ty,tp});
             }
         }
     }
     if(!vis[n][m][0])cout<<"-1"<<endl;
     else cout<<dp[n][m][0]<<endl;
     
     return 0;
 }



















