算法笔记--DFS和BFS的复习(板子)


迷宫
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
左上角走到右下角最短路径

BFS(广度优先搜索)

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
int map[5][5];
bool vis[5][5];
int d[5][5]={0};
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
struct State{
	int x;
	int y;
};
void bfs()
{
	queue<State> q;
	memset(vis,false,sizeof(vis));
	State qd,next,now;
	qd.x=0;
	qd.y=0;
	d[qd.x][qd.y]=0;
	q.push(qd);
	while(!q.empty())
	{
		now=q.front();
		q.pop();
		if(now.x==4 && now.y==4)	break;
		for(int i=0;i<4;i++)
		{
			next.x=now.x+dx[i];
			next.y=now.y+dy[i];
			if(next.x>=0 && next.y>=0 && next.x<5 && next.y<5 && !vis[next.x][next.y] && map[next.x][next.y]==0)
			{
				q.push(next);
				d[next.x][next.y]=d[now.x][now.y]+1;
				vis[next.x][next.y]=true;
			}
		}
	}
}
int main()
{
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			cin>>map[i][j];
	bfs();
	cout<<d[4][4];
}

DFS(深度优先搜索)

#include<iostream>
#include<cstdio>
using namespace std;
int map[5][5];
bool vis[5][5];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int d[5][5]={0};
void dfs(int x,int y)
{
	vis[x][y]=true;
	if(x==4 && y==4)
		return ;
	else
	{
		for(int i=0;i<4;i++)
		{
			int xx=x+dx[i];
			int yy=y+dy[i];
			if(xx>=0 && xx<5 && yy>=0 && yy<5 && map[xx][yy]==0 && !vis[xx][yy])
			{

				d[xx][yy]=d[x][y]+1;
				dfs(xx,yy);
			}
		}
	}
}
int main()
{
	memset(vis,false,sizeof(vis));
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			cin>>map[i][j];
	dfs(0,0);
	cout<<d[4][4];
} 

标记路径抽空整理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值