您的位置:首页 > 其它

习题 6-5 UVA 1600 Patrol Robot 巡逻的机器人

2016-02-27 15:58 435 查看
和普通的bfs基本一样,只不过多了一个可以穿越的障碍的条件!

思路:

建立一个三维数组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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: