uva1600 巡逻机器人
题目可以直接用dfs解决,只需要加一个参数记录当前穿越了多少个障碍,及时退出即可。
#include<bits/stdc++.h> using namespace std; const int INF=1<<25; int t,n,m,k,a[25][25],dx[4]={1,-1,0,0},dy[4]={0,0,1,-1},ans; int vis[25][25][25]; bool in(int x,int y){ return x>=1&&x<=m&&y>=1&&y<=n; } int dfs(int x,int y,int len,int kk) { if(x==m&&y==n)return len; for(int i=0;i<4;i++) { int xx=x+dx[i],yy=y+dy[i]; int cnt=kk; if(a[xx][yy]) cnt++; else cnt=0; if(in(xx,yy)&&(vis[xx][yy][cnt]<0 || vis[xx][yy][cnt]>len+1)&&cnt<=k) { vis[xx][yy][cnt]=len+1; ans=min(ans,dfs(xx,yy,len+1,cnt)); } }return ans; } int main() { cin>>t; while(t--) { memset(vis,-1,sizeof(vis)); ans=INF; cin>>m>>n>>k; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; ans=dfs(1,1,0,0); if(ans!=INF) printf("%d\n",ans); else printf("-1\n"); } }

浙公网安备 33010602011771号