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