您的位置:首页 > 其它

codeforces 616C The Labyrinth

2016-01-27 14:50 351 查看
从‘ . ’出发,相邻点作为连通块整体考虑,周围的星星要加上这堆点的个数。

两次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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: