习题 6-5 UVA 1600 Patrol Robot 巡逻的机器人
2016-02-27 15:58
435 查看
和普通的bfs基本一样,只不过多了一个可以穿越的障碍的条件!
思路:
建立一个三维数组vis表示是否访问过,第三维表示穿越的障碍数量。
结构体中包括坐标,步数,障碍数。
教训:
之前错一次,因为开成了二维数组,但仔细想想的话,开二维数组表示是否访问,可能会被其他同样的条件给覆盖掉!
代码如下:
思路:
建立一个三维数组vis表示是否访问过,第三维表示穿越的障碍数量。
结构体中包括坐标,步数,障碍数。
教训:
之前错一次,因为开成了二维数组,但仔细想想的话,开二维数组表示是否访问,可能会被其他同样的条件给覆盖掉!
代码如下:
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; struct point{ int x,y; int step; int obs; point(int x=0,int y=0,int step=0,int obs=0):x(x),y(y),step(step),obs(obs){} }; int n,m,k; const int maxn = 30; const int dx[] = {-1,1,0,0}; const int dy[] = {0,0,1,-1}; int mep[maxn][maxn]; bool vis[maxn][maxn][maxn]; bool init(int x,int y){ return x >= 0 && x < n && y >= 0 && y < m; } int ans(){ point start_point(0,0,0,0); memset(vis,0,sizeof(vis)); queue<point>q; q.push(start_point); vis[0][0][0]=true; while(!q.empty()){ point u = q.front();q.pop(); if (u.x == n-1 && u.y == m-1)return u.step; for (int i = 0; i < 4; ++i){ int nx = u.x + dx[i]; int ny = u.y + dy[i]; if (!init(nx,ny))continue; int obs=u.obs; if (mep[nx][ny])obs++; else obs=0; if (obs > k || vis[nx][ny][obs])continue; vis[nx][ny][obs]=true; point v(nx,ny,u.step+1,obs); q.push(v); } } return -1; } int main() { int T; cin >> T; while(T--){ cin >> n >> m >> k; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) scanf("%d",&mep[i][j]); cout << ans() << endl; } return 0; }
相关文章推荐
- 自动创建txt文件并写入内容
- csv文件用excel打开乱码
- 通过javamelody监控web应用的性能指标
- 【深入Java虚拟机】之六:Java语法糖
- JQUERY下的组件化编程之基本框架
- 类之间的关系
- SSM框架——实现分页和搜索分页
- PHP使用Memcache时模拟命名空间及缓存失效问题的解决
- ios Apple Pay 简单使用
- Android studio 和 Eclipse快捷键对比
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- 第一个作业
- 大型网站架构系列:电商网站架构案例(1)
- 【深入Java虚拟机】之四:类加载机制
- Codeforces Round #343 (Div. 2) Problem A & B
- Java工程师面试经验总结
- 【bzoj4104】[Thu Summer Camp 2015]解密运算 乱搞
- 闭包
- 292. Nim Game
- UVA NO.624 CD(打印路径,简单背包问题)