位图 |
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; }
评论