bfs主队列,dfs主栈。
相对而言,dfs计算方案数问题居多,bfs计算最短路程问题居多。
1:起点入队。
2:遍历队首可到达的点(树的话同理子节点),入队,标记。
3:若没有未标记的点可走,或者遍历完成,对手出队。直到队空或者到达目标位置。
一个全是字母的n*m矩阵,下一步只能走与自己当前字母不一样的地方。问最小路径长度。
(1 <= n,m <= 1000)
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false) , cin.tie(0) ;
#define ll long long
using namespace std ;
const int N = 1e5+5;
vector<string> ss;
struct poi{
int x,y,step;//step即要求的步数
};
int vis[1001][1001],n,m,flag = 0;//标记
queue<poi> q;//队列
int x4[4] = {0,0,1,-1};//方向
int y4[4] = {1,-1,0,0};//方向
int main( ){
cin >> n >> m;
ss.resize(n);
for(int i=0;i<n;i++)
cin >> ss[i];
//bfs
//(0,0) - (n-1,m-1)
q.push({0,0,0});
vis[0][0] = 1;//标记
while( !q.empty() ){//如果队列非空
int xx = q.front().x;
int yy = q.front().y;
if(xx == n-1 && yy == m-1){//到达!
flag = 1;//判断是否能到达目标
cout<<q.front().step;
break;
}
for(int i=0;i<4;i++){
int x1 = xx+x4[i] , y1 = yy+y4[i];//每个方向来一遍
//条件判断
if(!vis[x1][y1] && x1>=0 && y1>=0 && x1<n && y1<m && ss[xx][yy]!=ss[x1][y1]){
q.push({x1,y1,q.front().step+1});//入队
vis[x1][y1] = 1; //标记
}
}
q.pop();//队首遍历完了,队首出队
}
if(!flag)
cout<<-1;
}