没有想到第三维的数组,第三维区分同一个位置是否是穿墙到达的,很神奇,还有就是略微的dp思想没想到,同一个数组也是需要取最小值的
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=25; int dict[6][3]={{1,0},{0,1},{-1,0},{0,-1}}; int mapp[maxn][maxn]; int dp[maxn][maxn][maxn]; int t,m,n,k,ans; void dfs(int x,int y,int step,int wall) { if(x==m&&y==n) { ans=min(ans,step); return ; } for(int i=0;i<4;i++) { int xx=x+dict[i][0]; int yy=y+dict[i][1]; int st=wall; if(mapp[xx][yy]==1) st++; else st=0; if(xx>=1&&xx<=m&&yy>=1&&yy<=n) { if((dp[xx][yy][st]<0||dp[xx][yy][st]>step+1)&&st<=k) { dp[xx][yy][st]=step+1; dfs(xx,yy,step+1,st); } } } return ; } int main() { scanf("%d",&t); while(t--) { ans=1<<30; scanf("%d%d%d",&m,&n,&k); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&mapp[i][j]); memset(dp,-1,sizeof(dp)); dfs(1,1,0,0); if(ans==1<<30) printf("-1\n"); else printf("%d\n",ans); } return 0; }
原文:http://www.cnblogs.com/Wangwanxiang/p/6771391.html