题意:
求机器人走最短路线,而且可以穿越障碍。N代表有N行,M代表最多能一次跨过多少个障碍。
分析:
bfs()搜索,把访问状态数组改成了3维的,加了个维是当前能跨过的障碍数。
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>using namespace std;struct node{ int x,y,cnt,k;
};int m,n,k,map[25][25];int vis[25][25][25];int ans;int dis[4][2]={{-1,0},{0,1},{1,0},{0,-1}};void bfs(){ int i,j; queue<node>q; node u; u.x=0;u.y=0;u.cnt=0;u.k=k; vis[0][0][k]=1; q.push(u); while(!q.empty()) { u=q.front(); q.pop(); if(u.x==n-1&&u.y==m-1) { ans=u.cnt; return; } node v; if(u.k>=0) { for(i=0;i<4;i++) { v.x=u.x+dis[i][0]; v.y=u.y+dis[i][1]; v.cnt=u.cnt+1; if(map[v.x][v.y]) v.k=u.k-1; else v.k=k; if(v.y>=0&&v.y<m&&v.x<n&&v.x>=0&&!vis[v.x][v.y][v.k]) { if(v.k>=0) { q.push(v); vis[v.x][v.y][v.k]=1; } } } } } if (q.empty()) ans=-1;}int main(){ int T; scanf("%d",&T); int i,j; while(T--) { memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); cin>>n>>m>>k; for(i=0;i<n;i++) for(j=0;j<m;j++) cin>>map[i][j]; bfs(); cout<<ans<<endl; }
}
时间: 2024-11-05 22:53:28