http://acm.hdu.edu.cn/showproblem.php?pid=2645
找出每个点到距离最近的车站的距离。
直接bfs就好。
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 int n,m; 6 int maze[200][200],dis[200][200],vis[200][200]; 7 int dir[4][2]={-1,0,1,0,0,1,0,-1}; 8 struct point 9 { 10 int x,y,step; 11 }; 12 13 int bfs(int a,int b) 14 { 15 // printf("%d %d ",a,b); 16 memset(vis,0,sizeof(vis)); 17 queue<point>que; 18 point s; 19 s.x=a;s.y=b;s.step=0; 20 que.push(s); 21 vis[s.x][s.y]=1; 22 while(!que.empty()) 23 { 24 point e=que.front();que.pop(); 25 // printf("%d %d %d ",e.x,e.y,e.step); 26 if(maze[e.x][e.y]) return e.step; 27 for(int i=0;i<4;i++) 28 { 29 s.x=e.x+dir[i][0]; 30 s.y=e.y+dir[i][1]; 31 if(!vis[s.x][s.y]&&s.x>=0&&s.x<n&&s.y>=0&&s.y<m) 32 { 33 vis[s.x][s.y]=1; 34 s.step=e.step+1; 35 que.push(s); 36 } 37 } 38 } 39 } 40 41 int main() 42 { 43 // freopen("a.txt","r",stdin); 44 char s[200]; 45 while(~scanf("%d%d",&n,&m)) 46 { 47 for(int i=0;i<n;i++) 48 { 49 scanf("%s",s); 50 for(int j=0;j<m;j++) 51 { 52 maze[i][j]=s[j]-'0'; 53 //printf("%d ",maze[i][j]); 54 } 55 } 56 memset(dis,0,sizeof(dis)); 57 for(int i=0;i<n;i++) 58 for(int j=0;j<m;j++) 59 if(!maze[i][j]) 60 dis[i][j]=bfs(i,j); 61 for(int i=0;i<n;i++) 62 { 63 for(int j=0;j<m-1;j++) 64 printf("%d ",dis[i][j]); 65 printf("%d ",dis[i][m-1]); 66 } 67 } 68 return 0; 69 }