DFS
- 思想:一直往深处走,直到找到目标或者走不下去为止。通常用递归来实现
- 使用栈保存未被遍历的结点,结点按照深度优先的次序被访问并被压入栈中,并以相反的次序出栈
- 应用:走迷宫,查找环路,查找联通区域
BFS
下面以走迷宫为例分别用DFS与BFS判断能否从迷宫的起始点走到终点
- 思想:先遍历所有的兄弟节点再遍历子节点,按层遍历。通常用队列来实现
- 使用队列保存未被检测的结点。结点按照广度优先的次序被访问和进出队列
- 应用:找最短的路径,或者到一个目标最短要几步
下面以走迷宫为例分别用DFS与BFS判断能否从迷宫的起始点走到终点
DFS
#include <stdio.h>
int o[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };
int map[10][10] = {0};
int minStep = 100;
int stack[100][2] = {0};
int step = 0;
int minStack[100][2] = {0};
void DFS(int sY, int sX, int eY, int eX)
{
if (step >= minStep)return;
if (map[sY][sX] == 0)return;
stack[step][0] = sY;
stack[step++][1] = sX;
map[sY][sX] = 0;
if ((sY == eY) && (sX == eX))
{
if (minStep > step)
{
minStep = step;
for (int i = 0; i < step; i++)
{
minStack[i][0] = stack[i][0];
minStack[i][1] = stack[i][1];
}
}
map[sY][sX] = 1;
step--;
return;
}
for (int i = 0; i < 4; i++)
{
(DFS(sY + o[i][0], sX + o[i][1], eY, eX));
}
map[sY][sX] = 1;
step--;
return;
}
int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int N;
scanf("%d\n", &N);
for (int case_num = 0; case_num < N; case_num++)
{
for (int i = 1; i <= 8; i++)
{
for (int j = 1; j <= 8; j++)
{
scanf("%d\n", &map[i][j]);
}
scanf("\n");
}
}
DFS(1,1,8,8);
printf("%d\n", minStep-1);
for (int i = 0; i < minStep; i++)
{
printf("%d %d\n", minStack[i][0], minStack[i][1]);
}
//if (ret)printf("success\n");
//else printf("failed\n");
}
BFS
#include <stdio.h>
int o[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };
int map[10][10] = { 0 };
int queue[100][2] = {0};
int front = 0;
int back = 0;
int parent[10][10][2] = {0};
void BFS(int sY, int sX, int eY, int eX)
{
queue[back][0] = sY;
queue[back++][1] = sX;
map[sY][sX] = 1;
while (front < back)
{
int Y = queue[front][0];
int X = queue[front][1];
for (int i = 0; i < 4; i++)
{
int newY = Y + o[i][0];
int newX = X + o[i][1];
if (map[newY][newX] == 0)continue;
if (map[newY][newX] > (map[Y][X] + 1))
{
map[newY][newX] = map[Y][X] + 1;
parent[newY][newX][0] = Y;
parent[newY][newX][1] = X;
if ((newY == eY) && (newX == eX))
{
return;
}
queue[back][0] = newY;
queue[back++][1] = newX;
}
}
front++;
}
}
int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int N;
scanf("%d\n", &N);
for (int case_num = 0; case_num < N; case_num++)
{
for (int i = 1; i <= 8; i++)
{
for (int j = 1; j <= 8; j++)
{
scanf("%d\n", &map[i][j]);
if (map[i][j] == 1)map[i][j] = 100;//100 代表走过的
}
scanf("\n");
}
}
BFS(1, 1, 8, 8);
if (map[8][8] == 100)printf("failed\n");
else printf("%d\n", map[8][8]);
int x = 8, y = 8;
int stack[100][2] = {0};
int step = 0;
while (x > 0 || y > 0)
{
stack[step][0] = y;
stack[step++][1] = x;
int newY = parent[y][x][0];
int newX = parent[y][x][1];
x = newX;
y = newY;
}
for (int i = step - 1; i >= 0; i--)
{
printf("%d %d\n", stack[i][0], stack[i][1]);
}
}