您的位置:首页 > 其它

图论之搜索部分解题思路

2012-09-04 21:03 387 查看
HDU1728:http://acm.hdu.edu.cn/showproblem.php?pid=1728

该题不难,简单的BFS,其复杂的地方就是要找出其最小的转弯次数

#include<iostream>
#include<queue>
using namespace std;
int Sx,Sy,Ex,Ey,T;
int visit[101][101];
int n,m;
char Map[101][101];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct Node
{
int x;
int y;
int step; //转弯次数
int dir;

};
void BFS(int x,int y)
{
queue<Node> Q;
Node New;
New.x=x;
New.y=y;
New.step=0;
New.dir=-1;  //构建第一个节点信息
visit[x][y]=0;  //无转弯
Q.push(New);
while(!Q.empty())
{
New=Q.front();
Q.pop();
int u;
for(u=0;u<4;u++)
{
Node top=New;
top.x+=dir[u][0];
top.y+=dir[u][1];
if(top.x<1||top.x>n||top.y<1||top.y>m||Map[top.x][top.y]=='*') //越界、越到墙
continue;
if(top.dir!=u&&top.dir!=-1) //转弯判定,可推演
top.step++;
if(top.step>T) //超出界限,直接跳出,找下一组
continue;
if(top.x==Ex&&top.y==Ey) //找到
{
cout<<"yes"<<endl;
return;
}
if(visit[top.x][top.y]>=top.step) //记录下转弯数,并入队列
{
top.dir=u;
visit[top.x][top.y]=top.step;
Q.push(top);
}

}
}
cout<<"no"<<endl;
return;
}
int main()
{
int N;
while(cin>>N)
{
while(N--)
{
cin>>n>>m;
memset(Map,0,sizeof(Map));
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>Map[i][j];
visit[i][j]=999;  //标记每一个位置的转弯情况
}
cin>>T>>Sy>>Sx>>Ey>>Ex;  //行列相反
if(Sx==Ex&&Sy==Ey)
{
cout<<"yes"<<endl;
continue;
}
BFS(Sx,Sy); //传上开始位置
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: