两种BFS写法一个超时一个ac
查看原帖
两种BFS写法一个超时一个ac
1037870
jianxing04楼主2024/1/14 08:36

好奇怪,第一种bfs在将点取出时再改成'.',竟然有两个点过不了

#include<bits/stdc++.h>
using namespace std;
int n,m;
int dh[9]={0,-1,-1,-1,0,0,1,1,1};
int dl[9]={0,-1,0,1,-1,1,-1,0,1};
char Map[109][109];
int ans;
struct Info
{
    int x,y;
};
int Judge(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m&&Map[x][y]=='W';
}
void BFS(int x,int y)
{
    queue<Info> q;
    q.push((Info){x,y});
    Info Cur,Nex;
    while(!q.empty())
    {
        Cur=q.front();
        q.pop();
        Map[Cur.x][Cur.y]='.';
        for (int i=1;i<=8;i++)
        {
            if (Judge(Cur.x+dh[i],Cur.y+dl[i]))
            {
                Nex.x=Cur.x+dh[i];
                Nex.y=Cur.y+dl[i];
                q.push(Nex);
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            cin>>Map[i][j];
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            if (Map[i][j]=='W')
            {
                ans++;
                BFS(i,j);
            }
        }
    }
    cout<<ans;
	return 0;
}

修改成找到点之后先改为'.'就过了

#include<bits/stdc++.h>
using namespace std;
int n,m;
int dh[9]={0,-1,-1,-1,0,0,1,1,1};
int dl[9]={0,-1,0,1,-1,1,-1,0,1};
char Map[109][109];
int ans;
struct Info
{
    int x,y;
};
int Judge(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m&&Map[x][y]=='W';
}
void BFS(int x,int y)
{
    queue<Info> q;
    q.push((Info){x,y});
    Info Cur,Nex;
    Map[x][y]='.';
    while(!q.empty())
    {
        Cur=q.front();
        q.pop();
        for (int i=1;i<=8;i++)
        {
            if (Judge(Cur.x+dh[i],Cur.y+dl[i]))
            { 
                Nex.x=Cur.x+dh[i];
                Nex.y=Cur.y+dl[i];
                Map[Nex.x][Nex.y]='.';
                q.push(Nex);
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            cin>>Map[i][j];
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            if (Map[i][j]=='W')
            {
                ans++;
                BFS(i,j);
            }
        }
    }
    cout<<ans;
    system("pause");
	return 0;
}

why???

2024/1/14 08:36
加载中...