在信息学竞赛中,图论是比较重要的一部分,在有关图论的问题中,搜索占据着很大的份额。典型的有最短路径问题、割边等等,其中最基础的莫过于搜索。
广度优先搜索是最基本的一种方法,在很多算法中都有其思想所在,著名的Dijkstra算法等。其实广度优先搜索就是找出最优路径,相比深度优先搜索其有点就是能给出一个最优的解,而深度搜索只能说明存在一条路径可达,并不保证最优。
来看一题,题目比较长,我给出一个链接有兴趣的读者可自行去看。
http://acm.hdu.edu.cn/showproblem.php?pid=1072
题目的大意就是,在一个相对动态的时间里能否到达指定地点,能的话给出最短时间,不能输出-1。
下面给出源码:
Author:Jeick Jia(贾钰)
Time:2011-4-21
Platform:Linux/G++
#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
struct Point{
int x,y,time,step;
Point():x(0),y(0),time(0),step(0){}
};
const int Max = 10;
int map[Max][Max];
int visit[Max][Max];
int xB,yB,xE,yE;
int row,col,step;
int Go[4][2] = {
{0,1},{0,-1},{1,0},{-1,0}};
bool check(int x,int y)
{
return (x>=0&&x<row)&&(y>=0&&y<col)&&(map[x][y]!=0);
}
void BFS()
{
queue<Point> Que;
visit[xB][yB] = 6;
Point pt;
pt.x = xB;pt.y = yB;
pt.time = 6;pt.step = 0;
Que.push(pt);
while(!Que.empty())
{
Point pnd = Que.front();
Que.pop();
if(pnd.x==xE&&pnd.y==yE&&pnd.time>0) //arravel at the exit
{
step = pnd.step;return ;
}
for(int i=0;i<4;i++)
{
Point temp;
temp.x = pnd.x+Go[i][0];
temp.y = pnd.y+Go[i][1];
temp.time = pnd.time;
temp.step = pnd.step;
if(check(temp.x,temp.y))
{
temp.time–;
temp.step++;
if(temp.time<1) continue;
if(map[temp.x][temp.y]==4) //reset the time
temp.time = 6;
if(temp.time>0&&visit[temp.x][temp.y]<temp.time) //get in the queue
{
visit[temp.x][temp.y] = temp.time;
Que.push(temp);
}
}
} // end for
} //end while
return ;
}
int main()
{
int T;
scanf(“%d”,&T);
while(T–)
{
scanf(“%d%d”,&row,&col);
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
{
scanf(“%d”,&map[i][j]);
if(map[i][j]==2) //the entrance
{
xB = i;yB = j;
}
else if(map[i][j]==3)
{
xE = i;yE = j; //the exit
}
visit[i][j] = 0;
}
step = -1;
BFS();
printf(“%d\n”,step);
}
return 0;
}
-------------------------
前方道路还有很长,我需要不断的前进。
转载于:https://blog.51cto.com/jeick/550679
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110629.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...