深度搜索【dfs&bfs】

bfs

思路
  • 每次是访问某一层的所有结点
  • 记录的是层数【代表步数…】
  • 访问一层的同时,增添下一层的结点,直到没有可以添加的结点
  • 储存数据 层数:可以表示为这个结点的父节点的层数加一
马的遍历
#include<bits/stdc++.h>
using namespace std;
int vis[450][450];//是否经过
int ans[450][450];//储存步数 第一次到达的时候就是最短路径`

`int sx[8]={1,1,2,2,-1,-1,-2,-2};
int sy[8]={2,-2,1,-1,2,-2,1,-1};
int main()
{
	int n,m,x,y;
	cin>>n>>m>>x>>y;
	`

`queue<pair<int ,int > >q;//用队列储存
	q.push(make_pair(x,y));//读入起点
	vis[x][y]=1;//标记起点
	while(!q.empty())
	{
		int nx=q.front().first;//记录队首
		int ny=q.front().second;
		q.pop();//弹出
		for(int i=0;i<8;i++)//搜索
		{
			int next_x=nx+sx[i];
			int next_y=ny+sy[i];
			if(next_x>=1&&next_x<=n&&next_y>=1&&next_y<=m&&vis[next_x][next_y]!=1)//符合条件
			{
			  q.push(make_pair(next_x,next_y));//入队
			  vis[next_x][next_y]=1;//标记
			  ans[next_x][next_y]=ans[nx][ny]+1;//比上一个达到的点的步数多一步
		    }
	    }
   }
   for(int i=1;i<=n;i++) 
   {
   	    for(int o=1;o<=m;o++)
   	    {
   		   if(ans[i][o]==0&&(i!=x||o!=y))
   		   cout<<"-1"<<" ";
   		   else
		   cout<<ans[i][o]<<" ";
	    }
	    cout<<endl;
   }
}`

DFS

思路
  • 将问题分为多层
  • 记录每一层的状态(位置…)
  • 每一次过一个层,到终点后回溯到上一层
  • 储存数据:层数:在可以进行状态转移的时候+1
迷宫
`#include<iostream>
using namespace std;
int n,m,t,sx,sy,fx,fy,ob[100][100]={0},pd[100][100]={0},s=0;
void dfs(int x,int y)
{
	int s1[4]={-1,0,1,0};//状态如何变化
	int s2[4]={0,1,0,-1};
	if(x==fx&&y==fy)//满足条件
	{
		s++;//记录步数
		return;
	}
	for(int i=0;i<4;i++)
	{
		int nx=x+s1[i];
		int ny=y+s2[i];
		if(x>0&&x<=n&&y>0&&y<=m&&pd[nx][ny]!=1&&ob[nx][ny]!=1)
		{
			pd[x][y]=1;//当前状态是x,y 
			dfs(nx,ny);//下一步的状态 
			pd[x][y]=0;
		}
	}
}
int main()
{
	cin>>n>>m>>t;
	cin>>sx>>sy>>fx>>fy;
	for(int i=1;i<=t;i++)
	{
		int b,c;
		cin>>b>>c;
		ob[b][c]=1;
	}
	dfs(sx,sy);
	cout<<s;
}`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值