cogs [POI1999] 位图
★ 输入文件:bit.in
输出文件:bit.out
简单对比
时间限制:1 s
内存限制:128 MB
【问题描述 】
给定一个 n*m 的矩形位图,位图中的每个像素不是白色就是黑色,但至少有一个是白色的。第 i 行、第 j 列的像素被称作像素 (i, j) 。两个像素 p1 = (i1, j1) , p2 = (i2, j2) 之间的距离定义为: d(p1, p2) = |i1 - i2| + |j1 - j2|.
【任务 】
编一个程序完成以下操作:
1 .从输入文件中读入此位图的有关信息。
2 .对于每个像素,计算此像素与离其最近的“白像素”的距离。
3 .将结果写到输出文件里面。
【输入格式 】
输入文件的第一行包含两个整数 n, m ( 1 ≤ n ≤ 182, 1 ≤ m ≤ 182 ),用一个空格隔开。接下来 n 行,每一行都包含一个长度为 m 的 01 串;第 i+1 行,第 j 列的字符若为 1 ,则像素 (i, j) 是白色的;否则是黑色的。
【输出格式 】
输出文件包含 n 行 , 每行有 m 个用空格隔开的整数。第 i 行、第 j 列的整数表示 (i, j) 与离它最近的白像素之间的距离
【样例输入】
bit.in
3 4
0001
0011
0110
【样例输出】
bit.out
3 2 1 0
2 1 0 0
1 0 0 1
T 1/3:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<queue> 6 #include<cstring> 7 #include<string> 8 9 using namespace std; 10 const int N=190; 11 const int xd[8]={0,0,1,-1}; 12 const int yd[8]={-1,1,0,0}; 13 14 struct node{ 15 int x,y,step; 16 }now,nxt,tim; 17 18 int a[N][N]; 19 int ans[N][N]; 20 bool jud[N][N]; 21 bool vis[N][N]; 22 int n,m; 23 queue<node>q; 24 25 int read() 26 { 27 int x=0; 28 bool flag=1; 29 char c=getchar(); 30 while(c<'0'||c>'9')c=getchar(); 31 while(c>='0'&&c<='9'&&flag) 32 { 33 x=c-'0'; 34 flag=0; 35 } 36 return x; 37 } 38 39 inline void bfs(int x,int y) 40 { 41 memset(jud,0,sizeof(jud)); 42 while(!q.empty())q.pop(); 43 jud[x][y]=1; 44 now.x=x; 45 now.y=y; 46 now.step=0; 47 q.push(now); 48 while(!q.empty()) 49 { 50 tim=q.front(); 51 q.pop(); 52 for(int i=0;i<4;i++) 53 { 54 int xx=tim.x,yy=tim.y; 55 if(!jud[xx+xd[i]][yy+yd[i]]&&xx+xd[i]>0&&xx+xd[i]<=n&&yy+yd[i]>0&&yy+yd[i]<=m) 56 { 57 int xxx=xx+xd[i]; 58 int yyy=yy+yd[i]; 59 jud[xx+xd[i]][yy+yd[i]]=1; 60 nxt.x=xx+xd[i]; 61 nxt.y=yy+yd[i]; 62 nxt.step=tim.step+1; 63 int step=nxt.step; 64 if(a[nxt.x][nxt.y]==1) 65 { 66 ans[x][y]=nxt.step; 67 return ; 68 } 69 q.push(nxt); 70 } 71 } 72 } 73 } 74 75 int main() 76 { 77 freopen("bit.in","r",stdin); 78 freopen("bit.out","w",stdout); 79 scanf("%d%d",&n,&m); 80 for(int i=1;i<=n;i++) 81 for(int j=1;j<=m;j++) 82 a[i][j]=read(); 83 for(int i=1;i<=n;i++) 84 for(int j=1;j<=m;j++) 85 { 86 if(a[i][j]==1) 87 { 88 ans[i-1][j]=1,vis[i-1][j]=1; 89 ans[i+1][j]=1,vis[i+1][j]=1; 90 ans[i][j-1]=1,vis[i][j-1]=1; 91 ans[i][j+1]=1,vis[i][j+1]=1; 92 } 93 } 94 for(int i=1;i<=n;i++) 95 for(int j=1;j<=m;j++) 96 if(!a[i][j]&&!vis[i][j]) 97 bfs(i,j); 98 99 for(int i=1;i<=n;i++) 100 { 101 for(int j=1;j<=m;j++) 102 { 103 if(!a[i][j])printf("%d ",ans[i][j]); 104 else printf("0 "); 105 } 106 printf("\n"); 107 } 108 return 0; 109 } 110 /* 111 3 4 112 0001 113 0011 114 0110 115 */
思路果然挺简单:
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 int n,m; 6 int a[200][200]; 7 int dx[] = {0,1,0,-1}; 8 int dy[] = {1,0,-1,0}; 9 queue<int>q,p; 10 11 void bfs() 12 { 13 while(!q.empty()) 14 { 15 int x = q.front(),y = p.front(); 16 q.pop(); 17 p.pop(); 18 for(int i = 0; i < 4; i++) 19 { 20 int xx = x + dx[i],yy = y + dy[i]; 21 if(xx >= 1 && xx <= n && yy >= 1&& yy <= m && a[xx][yy] != 0 ) 22 { 23 if(a[xx][yy] == -1) 24 { 25 a[xx][yy] = a[x][y] + 1; 26 q.push(xx); 27 p.push(yy); 28 } else 29 { 30 if(a[xx][yy] > a[x][y] + 1) 31 { 32 a[xx][yy] = a[x][y] + 1; 33 q.push(xx); 34 p.push(yy); 35 } 36 } 37 } 38 } 39 } 40 } 41 42 void input() 43 { 44 scanf("%d%d", &n, &m); 45 memset(a,-1,sizeof(a)); 46 for(int i = 1; i <= n; i++) 47 { 48 char s[200]; 49 scanf("%s", s); 50 for(int j = 0; j < m; j++) 51 { 52 if(s[j] == '1') 53 { 54 a[i][j+1] = 0; 55 q.push(i); 56 p.push(j+1); 57 } 58 } 59 } 60 } 61 62 void output() 63 { 64 for(int i = 1; i <= n; i++) 65 { 66 for(int j = 1; j <= m; j++)printf("%d ",a[i][j]); 67 printf("\n"); 68 } 69 } 70 71 void solve() 72 { 73 bfs(); 74 } 75 int main() { 76 freopen("bit.in","r",stdin); 77 freopen("bit.out","w",stdout); 78 input(); 79 solve(); 80 output(); 81 }