K题BFS通过97.44%后超时

赛时代码超时,看群里大家都说是memset的原因,然后我看不太懂DFS做法,就去翻大家的代码看怎么用BFS写,偶然看到了用下面的代码来代替memset的。

我用这一段代替我原先代码中的memset,果然能过。

接着,我突然发现我原来的vis数组用的是int类型,我试着把int改成bool,保留memset居然也能过。

然后我去试了几个别人的超时代码,发现他们vis数组都是用的int类型,把int改成bool就可以过了。

比如这一篇提问

反过来,我试着将几个别人过了的代码的vis数组的类型改成int,反而会TLE。

但是,我去看了大佬DFS的做法,用int也只要几十ms🤔.

然后贴一下我的做法吧😊

#include<bits/stdc++.h>
using namespace std;
const int N=510;
typedef pair<int,int>PII;
char g[N][N];
bool st[N][N];//int st[N][N];改过来的
set<PII>s;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int n,m;
int bfs(int x,int y)
{
    int cnt=0;
    queue<PII>q;
    q.push({x,y});
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        st[t.first][t.second]=1;
        for(int i=0;i<4;i++)
        {
            int a=t.first+dx[i],b=t.second+dy[i];
            if(st[a][b])continue;
            if(a<=0||a>n||b<=0||b>m)continue;
            if(g[a][b]=='1'){
                st[a][b]=1;
                s.erase({a,b});
                q.push({a,b});
            }
            if(g[a][b]=='0'){
                st[a][b]=1;
                cnt++;
            }
        }
    }
    return cnt;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>g[i][j];
            if(g[i][j]=='1')s.insert({i,j});
        }
    }
    int ans=0x3f3f3f3f;
    for(auto [x,y]:s)
    {
        memset(st,0,sizeof st);
        ans=min(ans,bfs(x,y));
    }
    cout<<ans;
    return 0;
}

全部评论
memset导致的
1 回复 分享
发布于 01-23 23:59 河南

相关推荐

03-25 19:00
东北大学 Java
程序员牛肉:太好了,是聊天记录。不得不信了。 当个乐子看就好,不要散播焦虑
点赞 评论 收藏
分享
可以不说话:笔试a了3道半,今天说是挂了😭😭
投递汇丰科技等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务