#include<bits/stdc++.h> using namespace std; int dx[4]={0,0,-1,1}; int dy[4]={-1,1,0,0}; #define int long long typedef pair<int,int> pii; const int N=11; int a[N][N]; int n,m,p; int c[N][N]; int dist[N][N][10010]; int st[N][N][10010]; struct node{ int x,y,p1; }; void solve() { cin>>n>>m>>p; 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++) { int y; cin>>y; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) c[i][j]=a[i][j]%(p-1); p--; queue<node>q; memset(dist,-1,sizeof dist); dist[1][1][a[1][1]%p]=0; st[1][1][a[1][1]%p]=1; q.push({1,1,a[1][1]%p}); while(q.size()) { auto t=q.front(); q.pop(); int x=t.x,y=t.y,p1=t.p1; for(int i=0;i<4;i++) { int a=dx[i]+x,b=dy[i]+y; int p11=(p1+c[a][b])%p; if(a>=1&&a<=n&&b>=1&&b<=m&&st[a][b][p11]==0) { st[a][b][p11]=1; dist[a][b][p11]=dist[x][y][p1]+1; q.push({a,b,p11}); } } } if(dist[n][m][0]==-1)cout<<"-1"<<endl; else cout<<dist[n][m][0]<<endl; } signed main() { int good_luck_to_you; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); good_luck_to_you=1; //cin>>good_luck_to_you; while(good_luck_to_you--) { solve(); } system("pause"); }
思路:
本题的思路主要卡在每个格子可以走很多次来满足题目中的条件,因为如果走很多次我不知道结束条件是什么,所以正确思路为,因为n,m的值很小,可以开三维数组来解决这个问题,dist[x][y][p]表示坐标为(x,y)的格子经过计数器取模后的离(1,1)的距离,加上一维后完美解决了我担心的问题,最后dist[n][m][0]即为所求,这个思路也是很常用的,所以还要多加总结。