您的位置:首页 > 其它

HDU ACM 1728 逃离迷宫 (广搜BFS)

2012-08-27 20:39 169 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1728

题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点

   输入时注意起点与终点是先y后x的

思路:用point[4][2]表示方向向量,每次遍历遍历一行或者一列,遍历时要注意遇到遍历过的点要跳过去,继续遍历他后面的点而不是直接结束.

  由于每次遍历一行所以并不需要记录初始方向.

  记录转弯次数则在每一取队头时,把转弯数+1.

还是不懂得化去看看KIDx大牛的/article/4494909.html

View Code

#include<iostream>
#include <queue>
using namespace std;
const int MAX = 100 + 10;
const int INF = 0x3fffffff;
char map[MAX][MAX];
int used[MAX][MAX];
int point[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//
struct Node
{
int x;
int y;
int turn;
};
int x,y;
int BFS(Node a,Node b)
{
memset(used,0,sizeof(used));
queue <Node> q;
a.turn = -1;
q.push(a);
used[a.x][a.y] = 1;
while(!q.empty())
{
Node mid;
mid = q.front();

q.pop();
if(mid.x == b.x && mid.y == b.y)
{
b.turn = mid.turn;
}
int i;
mid.turn++;
for(i=0;i<4;i++)
{

a.x = mid.x + point[i][0];
a.y = mid.y + point[i][1];
a.turn = mid.turn;

while(1)
{
if(map[a.x][a.y]!='*' && a.x>0 && a.y>0 && a.x<=x && a.y<=y)
{
if( used[a.x][a.y] == 1 )
{
a.x = a.x + point[i][0];
a.y = a.y + point[i][1];

}
else
{

q.push(a);
used[a.x][a.y] = 1;
a.x = a.x + point[i][0];
a.y = a.y + point[i][1];

}
}
else
{
break;
}
}
}
}
return b.turn;
}

int main()
{
int T;
cin>>T;
while(T--)
{
memset(map,0,sizeof(map));
cin>>x>>y;
int i,j;
for(i=1;i<=x;i++)
{
for(j=1;j<=y;j++)
{
cin>>map[i][j];
}
}
int k;
Node a,b;
cin>>k>>a.y>>a.x>>b.y>>b.x;
b.turn = INF;
if( BFS(a,b) <= k)
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: