题意:

  给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= 20)个障碍物, 求最短路径, 如无法到达输出 -1。

分析:

    对于空地, 建一个vis数组记录走过的空地, 然后每次碰到没vis过的空地都把队伍K更新为最大值, vis这块地。

  对于墙的情况, 我们可以建一个vis1数组去记录通过墙时候的k值, 如果之前有一个k值比现在要通过的大, 那么我们就不入队, 否则入队,入队k是队头k-1, 更新这堵墙的k值。

 #include <bits/stdc++.h>
using namespace std;
const int maxn = ;
int G[maxn][maxn];
int vis[maxn][maxn];
int visk[maxn][maxn];
int dx[] = {,,,-};//右下左上
int dy[] = {,,-,};
struct node{
int x,y, step, k;
node(int x, int y, int step, int k):x(x), y(y), step(step), k(k){}
};
int n, m, k;
bool vaild(int x, int y){
if(x < || x >= n || y < || y >= m)
return false;
return true;
}
int main(){ int T;
scanf("%d", &T);
while(T--){
memset(G,,sizeof(G));
memset(vis,,sizeof(vis));
memset(visk,,sizeof(visk));
scanf("%d %d", &n, &m);
scanf("%d", &k);
for(int i = ; i < n; i++){
for(int j = ; j < m; j++){
scanf("%d", &G[i][j]);
}
} int ok = ;
queue<node> q;
q.push(node(,,,k));
visk[][] = k;
vis[][] = ;
int cnt = ;
while(!q.empty()){
node t = q.front(); q.pop();
// printf("%d %d %d %d\n", t.x,t.y, t.step, t.k);
if(t.x == n- && t.y == m-){
printf("%d\n",t. step );
ok = ;
break;
}
for(int i = ; i < ; i++){
int tx = t.x + dx[i];
int ty = t.y + dy[i];
if(vaild(tx,ty)){
if(G[tx][ty] == ){
if( t.k - >= && visk[tx][ty] <= t.k - ){
// if(!vis[tx][ty]){
q.push(node(tx,ty,t.step+, t.k - ));
visk[tx][ty] = t.k - ;
// vis[tx][ty] = 1;
// }
}
}
else {
if(!vis[tx][ty]){
q.push(node(tx,ty,t.step+,k));
vis[tx][ty] = ;
}
}
}
}
}
if(!ok) printf("-1\n");
}
return ;
}

最新文章

  1. Ubuntu 系统 update-rc.d 命令
  2. mvc+webapi 单元测试
  3. HTML5 javascript CSS3 jQuery Mobile一些好用的网站
  4. C/c++笔试经典程序(一)
  5. 学习使用LaTex排版文字输出为pdf(1)
  6. hadoop DataNode实现分析
  7. cxx-generator JS绑定工具
  8. POJ 2096-Collecting Bugs(概率dp入门)
  9. Android Activity交互及App交互
  10. .NET性能优化方面的总结
  11. php 文件操作类
  12. Javaweb阶段知识回顾一
  13. JAVA虚拟机:对象的创建过程
  14. Docker-常用命令(7)
  15. suoi08 一收一行破 (tarjanLca+树状数组)
  16. IDEA导入springboot项目不能启动
  17. 牛客训练四:Applese 涂颜色(费马小定理+快速幂)
  18. 在ASP.NET MVC中使用Knockout实践07,自定义验证信息的位置与内容
  19. C# 将RichTextBox中内容的文档以二进制形式存
  20. hydra nodejs 微服务框架简单试用

热门文章

  1. 使用VS2008,VS2010编译64位的应用程序
  2. ACM_最小公倍数
  3. 在Eclipse+ADT中开发Android系统的内置应用
  4. UIAlertController的使用,代替UIAlertView和UIActionSheet
  5. hadoop-0.20.2完全分布式集群
  6. 可变类型的安全性——更锋利的C#代码小记(2)
  7. 开发一个 Web App 必须了解的那些事
  8. java封装的优点
  9. 开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码
  10. LitePal用法详解