广度优先搜索
属于一种盲目的搜索法,系统展开并检查图中的所有节点,以寻求结果,并不考虑结果的可能位置,得彻底搜索整张图,直到找到结果,牺牲空间换时间。广度优先搜索时间更快,但是相对内存更大;
广度优先搜索借助了队列,把所有展开的节点放入一个队列中,每次从队首取出节点,再将该节点的展开节点放入队尾,直到达到终点或者队列为空;
算法:
(1)将起点入队;
(2)队首结点可拓展的点入队;如果没有课拓展的点,则将队首元素出队,重复该步骤,直到队列为空或满足条件;
#include<iostream>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
int a[100][100],book[100][100];
struct point{
int x;
int y;
int step;
};
queue<point> r;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main(){
int n,m,startx,starty,p,q;
cin >> n >>m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j ++){
cin >>a[i][j];
}
}
cin >>startx >> starty >> p >> q;
//BFS
point start;
start.x = startx;
start.y = starty;
start.step = 0;
r.push(start);
book[startx][starty] = 1;
int flag = 0;
while(!r.empty()){
int x = r.front().x;
int y = r.front().y;
if(x == p && y == q){
flag = 1;
cout <<r.front().step;
break;
}
for(int k = 0; k <= 3 ; k++){
int tx,ty ;
tx = x + dx[k];
ty = y + dy[k];
if(a[tx][ty]==1&&book[tx][ty]==0){
//入队
point temp;
temp.x = tx;
temp.y = ty;
temp.step = r.front().step +1;
r.push(temp);
book[tx][ty]=1;
}
}
r.pop();
}
if(flag == 0)
cout<<"no";
return 0;
}
/*
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
*/