1. 程式人生 > >[Offer收割]程式設計練習賽9 B題 水陸距離

[Offer收割]程式設計練習賽9 B題 水陸距離

題目2 : 水陸距離
時間限制:10000ms
單點時限:1000ms
記憶體限制:256MB

描述

給定一個N x M的01矩陣,其中1表示陸地,0表示水域。對於每一個位置,求出它距離最近的水域的距離是多少。

矩陣中每個位置與它上下左右相鄰的格子距離為1。
輸入

第一行包含兩個整數,N和M。

以下N行每行M個0或者1,代表地圖。

資料保證至少有1塊水域。

對於30%的資料,1 <= N, M <= 100

對於100%的資料,1 <= N, M <= 800
輸出

輸出N行,每行M個空格分隔的整數。每個整數表示該位置距離最近的水域的距離。
樣例輸入

4 4  
0110  
1111  
1111  
0110

樣例輸出

0 1 1 0  
1 2 2 1  
1 2 2 1  
0 1 1 0

題目一眼掃下去,就知道是使用節點展開的寬度優先搜尋演算法(bfs),筆者不是太熟練,就使用了兩個佇列分別push和pop來實現,其實一個佇列就可以了,只需要記下來佇列原來的size即可。

#include <iostream>
#include <queue>
using namespace std;
int x[4]={0,1,0,-1};
int y[4]={-1,0,1,0};
int flag=0;
int main()
{
    int n,m;
    cin>>n>>m;
    int
b[1000][1000]; getchar(); char a; queue <pair <int,int>> qu; queue <pair <int,int>> qu2; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%c",&a); if(a=='0') { b[i][j]=0; qu.push(make_pair(i,j)); } else
b[i][j]=m+n+10086; } getchar(); } while(true) { flag++; while(!qu.empty()) { int xx=qu.front().first; int yy=qu.front().second; for(int i=0;i<=3;i++) { if(b[xx+x[i]][yy+y[i]]==m+n+10086&&(xx+x[i])>=1&&(yy+y[i])>=1&&(xx+x[i])<=n&&(yy+y[i])<=m) { b[xx+x[i]][yy+y[i]]=flag; qu2.push(make_pair(xx+x[i],yy+y[i])); } } qu.pop(); } flag++; while(!qu2.empty()) { int xx=qu2.front().first; int yy=qu2.front().second; for(int i=0;i<=3;i++) { if(b[xx+x[i]][yy+y[i]]==m+n+10086&&(xx+x[i])>=1&&(yy+y[i])>=1&&(xx+x[i])<=n&&(yy+y[i])<=m) { b[xx+x[i]][yy+y[i]]=flag; qu.push(make_pair(xx+x[i], yy+y[i])); } } qu2.pop(); } if(qu.empty()&&qu2.empty()) break; } for(int i=1;i<=n;i++) { for(int j=1;j<m;j++) { cout<<b[i][j]<<" "; } cout<<b[i][m]<<endl; } }

wa了一發,因為輸入的圖裡面居然沒有空格,這個真的有的驚訝,233333,太粗心了。