在人工智能中,盲目搜索是相对于启发式搜索来说的。
13.1 广度优先搜索
《算法导论》中,广度优先(Breadth-First)搜索树的伪代码如下:
BFS(G,s)
1 for each vertex u ∈ V[G] - {s}
2 docolor[u] ← WHITE
3 d[u] ← ∞
4 ∏[u] ← NIL
5 color[s] ← GRAY
6 d[s] ← 0
7 ∏[s] ← NIL
8 Q ← Ф
9 ENQUEUE(Q, s)
10while Q ≠ Ф
11 do u ← head[Q]
12 for each v ∈ Adj[u]
13 doif color[v] = WHITE
14 thencolor[v] ← GRAY
15 d[v] ← d[u] + 1
16 ∏[v] ← u
17 ENQUEUE(Q,v)
18 color[u] ← BLACK
13.1.1 实例
PKU JudgeOnline, 3669, Meteor Shower.
13.1.2 问题描述
初始位置在原点,所站的地方隔一段时间之后就要被砸,被砸的时候和以后该地方都不能待,要逃到一个安全的地方。问最少需要多少步才能到一个安全的地方。
PKU JudgeOnline, 3414, Pots是对状态空间的BFS搜索。
13.1.3 输入
4
00 2
21 2
11 2
03 5
13.1.4 输出
5
13.1.5 程序
#include <iostream.h>
#include <stdio.h>
#include <string.h>
int map[1002][1002];
bool visited[1002][1002];
int depth[1002][1002];
int queue[150100][2];
int top;
int adj[5][2] = {
{0, 0}, {0, -1}, {0, 1}, {-1, 0}, {1, 0}};
#define enqueue(i, j) queue[top][0] = i;queue[top][1] = j;top++;
#define MAX 0x7F7F7F7F
inline void dequeue(int *i, int *j)
{
top--;
*i = queue[top][0];
*j = queue[top][1];
}
int main()
{
//freopen("meteor.12.in","r", stdin);
//freopen("out.out","w", stdout);
int M;
int i;
int j;
int tempX;
int tempY;
inttempTime;
int X;
int Y;
int min;
scanf("%d",&M);
memset(map, 0x7F, sizeof(map));
for(i = 0;i < M; i++){
scanf("%d%d%d",&tempX, &tempY, &tempTime);
for(j =0; j < 5; j++){
X = tempX + adj[j][0];
Y = tempY + adj[j][1];
if((X>= 0&&Y >= 0)&&
(map[X][Y] > tempTime)){
map[X][Y] = tempTime;
}
}
}
memset(visited, 0, sizeof(visited));
depth[0][0] = 0;
top = 0;
enqueue(0, 0);
visited[0][0] =