| 位图 |
| Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB |
| Total submit users: 50, Accepted users: 43 |
| Problem 10109 : No special judgement |
| Problem description |
| 现在我们给出一个n×m的单色位图,且该为图中至少含有一个白色的像素。我们用(i, j)来代表第i行第j列的像素,并且定义两点p1=(i1, j1)和p2=(i2, j2)之间的距离为: d(p1, p2)=|i1 - i2| + |j1 - j2| 请写一个程序: 读入该位图;对于每个像素,计算出离该像素最近的白色像素与它的距离。 |
| Input |
| 第一行包括两个用空格分开的整数n和m,1<=n<=182,1<=m<=182。以下的n行每行包括一个长度为m的用0和1组成的字符串,在第i+1行的第j个字符如果为”1”,那么表示像素(i, j)为白的,否则为黑的。 |
| Output |
| 输出一个n×m的数表,其中的第i行的第j个数字为f(i, j)表示像素(i, j)到最近的白色像素的距离。 |
| Sample Input |
3 4 0001 0011 0110 |
| Sample Output |
3 2 1 0 2 1 0 0 1 0 0 1 |
#include <iostream>
#include <list>
using namespace std;
#define MAX_BIT 200
int gm[MAX_BIT][MAX_BIT];
char gs[MAX_BIT];
class node{
public:
int i,j;
node(int a=0, int b=0):i(a),j(b){}
void set(int a, int b){ i=a; j=b; }
};
void get(int i,int j,int value){
node a[4];
int it=0,jt;
if(gm[i-1][j]==-1 || gm[i-1][j]>value)
a[it++].set(i-1,j);
if(gm[i+1][j]==-1 || gm[i+1][j]>value)
a[it++].set(i+1,j);
if(gm[i][j-1]==-1 || gm[i][j-1]>value)
a[it++].set(i,j-1);
if(gm[i][j+1]==-1 || gm[i][j+1]>value)
a[it++].set(i,j+1);
for(jt=0; jt<it; jt++){
gm[a[jt].i][a[jt].j] = value;
get(a[jt].i,a[jt].j,value+1);
}
}
int main(){
int i,j,n,m;
list<node> t;
cin>>n>>m;
for(i=0; i<=m+1; i++)
gm[0][i]=gm[n+1][i]=0;
for(i=1; i<=n; i++){
cin>>&gs[1];
gm[i][0]=gm[i][m+1]=0;
for(j=1; j<=m; j++)
if(gs[j]=='1'){
gm[i][j] = 0;
t.push_back(node(i,j));
}else
gm[i][j] =-1;
}
for(list<node>::iterator it=t.begin(); it!=t.end(); it++)
get((*it).i,(*it).j,1);
for(i=1; i<=n; i++){
for(j=1; j<m; j++)
cout<<gm[i][j]<<' ';
cout<<gm[i][j]<<endl;;
}
return 0;
}

评论