巡逻机器人
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/F
题目大意:
机器人在一个矩形区域巡逻,是一网格(m行和n列)。从左上角(1,1)到右下角(m,n)。网络格
中的一些格子是空地(用0表示),其他格子是障碍(用1表示)。机器人每次有4个方向走,但不能
连续穿越k障碍,求最短长度。
分析:
用bfs进行搜索,不过当遇到障碍的时候记录下,当遇到的障碍超过k时,返回到上一步。
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m,k,t;
int map[][];
int d[][]= {,,-,,,-,,};
int c[][][];
struct A
{
int x,y;
int count;
int l;
A(int x,int y,int count,int l):x(x),y(y),count(count),l(l) {}
};
int Do()
{
queue<A>q;
A a(,,,);
q.push(a);
c[][][]=;
while(!q.empty())
{
A now=q.front();
q.pop();
if(now.x==n&&now.y==m)
return now.count;
for(int i=; i<; i++)
{
int x=d[i][]+now.x;
int y=d[i][]+now.y;
int l=now.l;
if(map[x][y]==)
l++;
else
l=;
if(l<=k&&c[x][y][l]!=&&x>=&&y>=&&x<=n&&y<=m)
{
c[x][y][l]=;
q.push(A(x,y,now.count+,l));
}
}
}
return -;
}
int main()
{
cin>>t;
while(t--)
{
memset(c,,sizeof(c));
cin>>n>>m>>k;
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
cin>>map[i][j];
cout<<Do()<<endl;
}
return ;
}