上学题解[bfs]

上学题解[bfs]_第1张图片
上学题解[bfs]_第2张图片

样例输入:

5 8
..#...##
#.#.#.##
#...#...
#.#.#.#.
....#.#.

样例输出:

15
1 1
1 2
2 2
3 2
3 3
3 4
2 4
1 4
1 5
1 6
2 6
3 6
3 7
3 8
4 8
5 8

思路:

看到最短路,先想到 b f s bfs bfs,这道题只是需要记录路径
我的代码是从起点搜的,路径需要用栈存,其实可以优化一下从中点往起点搜,这样方便记录路径。
除了记录路径,几乎是 b f s bfs bfs模板题。

代码:

#include
#include//bfs队列
#include//栈存储路径
using namespace std;
int n,m,xy[4][2]={{1,0},{0,1},{-1,0},{0,-1}},ans;//xy偏移量
char a[1010][1010];//存地图
bool mk[1010][1010];//mark标记数组
struct node{
	int x,y,step;
};
struct node1{
	int x,y;
}fr[1010][1010]; //记录路径
stack<node1>stk;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	//以下是bfs模板
	queue<node>q;
	q.push((node){1,1,0});
	node t;
	while(q.size()){
		t=q.front();
		if(t.x==n&&t.y==m){//如果到终点,记录最短步数
			ans=t.step;
			break;
		}
		q.pop();
		for(int i=0;i<4;i++){
			int xx=t.x+xy[i][0],yy=t.y+xy[i][1];
			if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&mk[xx][yy]==false&&a[xx][yy]=='.'){//判断越界,可行性
				mk[xx][yy]=true;//标记
				fr[xx][yy].x=t.x;//记录路径
				fr[xx][yy].y=t.y;//记录路径
				q.push((node){xx,yy,t.step+1});//入队,bfs常规操作
			}
		}
	}
	if(ans==0){
		cout<<-1<<endl;//如果答案没有被更新,输出-1
		return 0;
	}
	cout<<ans<<endl;
	while(1){
		stk.push((node1){t.x,t.y});
		if(t.x==1&&t.y==1){
			break;
		}
		int xx=t.x,yy=t.y;//一定要新定义两个变量存
		t.x=fr[xx][yy].x,t.y=fr[xx][yy].y;//重点,陷阱
		//如果写t.x=fr[x][y].x,t.y=fr[x][y].y,第二句话中的x在第一句话已经被替换了
	}
	while(stk.size()){//遍历栈输出路径
		cout<<stk.top().x<<" "<<stk.top().y<<endl;
		stk.pop();
	}
	return 0;
}

下一篇:骨头的诱惑

你可能感兴趣的:(搜索算法,个人学习总结,算法,广度优先,c++)