算法学习-广搜和深搜1-填色问题
广搜和深搜
由于每次学一点东西总结一下过于费时间,于是改为周末阶段总结,而且写得长篇大论同样浪费时间,我就按着自己可以理解的方式直接写好了,同时进行复习.
<广度优先搜索>
1.前言
- 广度优先搜索算法(Breadth-First Search,BFS是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。
- 实现思想:看这个。
总之广搜用队列,深搜用递归
2.代码实现
题目:洛谷P1162
解答:先用广搜从左上方开始找0:
......
int xx[4]={-1,1,0,0},yy[4]={0,0,-1,1};
int main()
{
......
queue<int> x,y;
x.push(0);//最初从(0,0)开始读入整组数据到二维数组arr中
y.push(0);
vis[0][0]=1;//表示0,0已经经过,防止重复计算(0,0)
if(!x.push())//队列x不为空,也就是队列x,y都不为空,因为都是添加(押入)和删除(弹出)。
{
for(int i=0;i<=3;++i)//通过之前定义的数组实现移动位置
{
int dx=x.front()+xx[i];
int dy=y.front()+yy[i];
if(arr[dx][dy]=='0'&&dx>=0&&dx<=n-1&&dy>='0'&&dy<=n-1&&vis[dx][dy]==0;)
{
x.push(dx);
y.push(dy);
vis[dx][dy]=1;
}
}
x.pop();
y.pop();
}
}
这样看样子就可以吧1外面所有的0都遍历了,不过万一1组成的包围圈把0给分割成不同部分呢?
有个办法就是把输入数据外面多加一圈零,也就是从(1,1)读入数据,接下来是完整代码。
#include<iostream>
#include<queue>
using namespace std;
int vis[35][35];
int map[35][35];
int xx[4]={0,-1,0,1};
int yy[4]={-1,0,1,0};
int main()
{
int i=0,n=0,j=0;
cin>>n;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
cin>>map[i][j];
}
queue<int> x;
queue<int> y;
x.push(0);
y.push(0);
vis[0][0]=1;
while(!x.empty())
{
for(i=0;i<=3;++i)
{
int dx=x.front()+xx[i];
int dy=y.front()+yy[i];
if(dx>=0&&dx<=n+1&&dy>=0&&dy<=n+1&&map[dx][dy]==0&&vis[dx][dy]==0)
{
x.push(dx);
y.push(dy);
vis[dx][dy]=1;
}
}
x.pop();
y.pop();
}
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
if(map[i][j]==1) cout<<1<<' ';
else if(map[i][j]==0&&vis[i][j]==1) cout<<0<<' ';
else cout<<2<<' ';
}
cout<<endl;
}
return 0;
}
<深搜>
八皇后就是深搜,不多赘述。
最后
不开心

浙公网安备 33010602011771号