codeforces 616C The Labyrinth

来源:互联网 发布:java http json接口 编辑:程序博客网 时间:2024/04/30 12:02

从‘ . ’出发,相邻点作为连通块整体考虑,周围的星星要加上这堆点的个数。

两次bfs,一次找连通块,一次找可达的星星‘ * ’

ps:1> 记得取模。

 2>要用int 取然后赋给char,一起用%s输出。——为了偷懒直接用char型字符取模结果。。。╮(╯▽╰)╭

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int m,n;char a[1010][1010],b[1010][1010];int vis[1010][1010];int dx[4]={-1,0,0,1};int dy[4]={0,-1,1,0};int num[1010][1010];/// bfs 找连通块int findblock(int x,int y){    int ans=0;    vis[x][y]=1;    int xx,yy;    for(int i=0;i<4;i++)    {        xx=x+dx[i];        yy=y+dy[i];        if(xx<0||yy<0||xx>=n||yy>=m)            continue;        if(vis[xx][yy]==1||a[xx][yy]=='*')            continue;       // cout<<xx<<" "<<yy<<endl;        ans+=findblock(xx,yy);    }    //cout<<"ans=="<<ans<<endl;    ans++;    return ans;}/// bfs 找可达*void findstar(int x,int y,int ans,int k){    vis[x][y]=0;    for(int i=0;i<4;i++)    {        int xx=x+dx[i];        int yy=y+dy[i];        if(xx<0||yy<0||xx>=n||yy>=m)            continue;        if(a[xx][yy]=='*'&&vis[xx][yy]!=k)        {            vis[xx][yy]=k;            num[xx][yy]+=ans;            //char x=num[xx][yy]+'0';            //cout<<xx<<" "<<yy<<" "<<x<<endl;        }        else if(a[xx][yy]=='.'&&vis[xx][yy]==1)        {            findstar(xx,yy,ans,k);        }    }}int main(){    scanf("%d%d",&n,&m);/// n行m列    for(int i=0;i<n;i++)        scanf("%s",a[i]);    memset(vis,-1,sizeof(vis));    memset(num,0,sizeof(num));    for(int i=0;i<n;i++)    {        for(int j=0;j<m;j++)        {            if(a[i][j]=='.'&&vis[i][j]==-1)            {//cout<<"-1"<<endl;                int ans=findblock(i,j);               // cout<<"           "<<i<<" "<<j<<" "<<ans<<endl;                findstar(i,j,ans,i*m+j);            }        }    }    for(int i=0;i<n;i++)    {        for(int j=0;j<m;j++)        {            if(a[i][j]=='*')            {                num[i][j]+=1;                num[i][j]=num[i][j]-(num[i][j]/10)*10;/// 不可用 char 取模                b[i][j]=num[i][j]+'0';            }            else                b[i][j]='.';        }        printf("%s\n",b[i]);    }    return 0;}


0 0
原创粉丝点击