[Offer收割]程式設計練習賽9 B題 水陸距離
阿新 • • 發佈:2019-01-03
題目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,太粗心了。