8/10 晴 星期一
可能是自己太弱了或者是太自大了,导致做题一直都很粗心爆栈。今天做了道POJ3278 看了大佬的bfs思路 自己也稍微了解了些算法思想 还是得自己更多去思考 今天下午做了一下午没有思绪 还是得换个想法 不能死磕下去
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=100001;
int n,k,mim=1e5+5,vis[maxn],step[maxn];
queue<int>q;
int bfs()
{
int head,next;
q.push(n);
step[n]=0;
vis[n]=1;
while(!q.empty())
{
head=q.front();
q.pop();
for(int i=0;i<3;i++) ///三个条件的判断
{
if(i==0) next=head*2;
if(i==1) next=head+1;
if(i==2) next=head-1;
if(next<0||next>=maxn) continue; ///判断是否出界
if(!vis[next])
{
q.push(next);
vis[next]=1;
step[next]=step[head]+1;
}
if(next==k) return step[next]; ///返回条件
}
}
}
int main()
{
while(cin>>n>>k)
{
mim=1e5+5;
if(n>=k)
cout<<n-k<<endl;
else
cout<<bfs()<<endl;
while(!q.empty()) q.pop();
}
}
PS:等会再去做一道bfs题目,好好地思考bfs的方法,bfs更多适合于找最短路比如迷宫,以空间换时间。
8/18 星期二 晴
经过一段时间的搜索训练之后,将bfs和dfs的用处弄清楚后我发现各有各的好处,但是我更喜欢bfs因为不容易爆栈也不容易超时,因为我还是挺容易TLE的。今天做了两题 洛谷 P2298和P1746
直接码了,就是需要bfs去搜索就好啦
P2298
#include<bits/stdc++.h>
using namespace std;
int n,m,vis[2005][2005],tx[]={0,1,0,-1},ty[]={1,0,-1,0},step[2005][2005];
char c[2005][2005];
struct Node{
int x,y;
};
int bfs(int x,int y)
{
struct Node node;
node.x=x,node.y=y;
queue<Node>q;
q.push(node);
vis[x][y]=1;
step[x][y]=0;
while(!q.empty())
{
int dx=q.front().x;
int dy=q.front().y;
q.pop();
for(int i=0;i<4;i++)
{
int xx=dx+tx[i];
int yy=dy+ty[i];
//判断条件
if(!vis[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=m&&(c[xx][yy]=='d'||c[xx][yy]=='.'))
{
vis[xx][yy]=1;
step[xx][yy]=step[dx][dy]+1;
if(c[xx][yy]=='d')
return step[xx][yy];
node.x=xx,node.y=yy;
q.push(node);
}
}
}
return -1;
}
int main()
{
cin>>n>>m;
int x,y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>c[i][j];
if(c[i][j]=='m')
x=i,y=j;
}
int flag=bfs(x,y);
if(flag==-1)
cout<<"No Way!"<<endl;
else
cout<<flag;
return 0;
}
P1746 这题出现了一个大问题少写了一个 = 导致出现了巨大bug
我贴代码居然出错了,可能是格式问题把,所以贴了图片

8/19 星期三 晴
今天找到了一个搜索题单,去看了一下做了几道题。只有一个题我觉得感觉不用bfs和dfs那就是洛谷 P1332 我用的距离去做 发现直接A了 哈哈哈哈
#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,cnt[100005],num=0;
struct Node{
int x,y;
}infect[100005];
int main()
{
cin>>n>>m;
cin>>a>>b;
for(int i=0;i<a;i++)
cin>>infect[i].x>>infect[i].y;
for(int i=0;i<b;i++)
{
int x,y,minx=1e6+5;
cin>>x>>y;
for(int j=0;j<a;j++)
{
int t=abs(x-infect[j].x)+abs(y-infect[j].y);
if(t<minx)
minx=t;
}
cnt[num++]=minx;
}
for(int i=0;i<num;i++)
cout<<cnt[i]<<endl;
}
PS:这里一个一个去找最小值就好了,不用什么dfs和bfs就很快乐
博主分享了在解决POJ3278和洛谷P2298等题目中的BFS策略,强调了BFS在避免爆栈和超时方面的优势,并讨论了BFS与其他搜索算法的区别。还提到在不同任务中灵活运用BFS,如迷宫求最短路径和数据结构问题求解。
1430

被折叠的 条评论
为什么被折叠?



