2020-08-17

博主分享了在解决POJ3278和洛谷P2298等题目中的BFS策略,强调了BFS在避免爆栈和超时方面的优势,并讨论了BFS与其他搜索算法的区别。还提到在不同任务中灵活运用BFS,如迷宫求最短路径和数据结构问题求解。

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就很快乐

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值