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;
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;
}`