30pts玄关
查看原帖
30pts玄关
1076971
anke2017楼主2024/9/29 20:28

RT,它炸了。

测试时很后面才出错。

#include<iostream>
#include<queue>
#include<algorithm>

using namespace std;

struct node
{
    int x,y,val;
};

bool can_go[1002][1002];
bool visited[1002][1002];
int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};

int bfs(int sx,int sy)
{
    queue<node> q;
    q.push({sx,sy,1});
    int ans=1;
    while(!q.empty())
    {
        node tmp=q.front();q.pop();
        for(int i=1;i<=4;i++)
        {
            if(visited[tmp.x+dx[i]][tmp.y+dy[i]]||(!can_go[tmp.x+dx[i]][tmp.y+dy[i]]))continue;
            visited[tmp.x+dx[i]][tmp.y+dy[i]]=1;
            q.push({tmp.x+dx[i],tmp.y+dy[i],tmp.val+1});
        }
        ans=tmp.val;
    }
    return ans;
}

int vals[1000001];

int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            char tmp;cin>>tmp;
            can_go[i][j]=tmp-'0';
        }
    }
    for(int i=1;i<=n;i++)visited[i][0]=visited[0][i]=visited[n+1][i]=visited[i][n+1]=1;
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
        	if(visited[i][j]==0&&can_go[i][j])vals[++cnt]=bfs(i,j);
		}
    }
    sort(vals+1,vals+1+cnt);
    cout<<cnt<<'\n';
    for(int i=1;i<=cnt;i++)cout<<vals[i]<<'\n';
    
    return 0;
}
2024/9/29 20:28
加载中...