原文衔接:https://hihocoder.com/contest/hiho236/problem/1
以下是我的代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stdlib.h>
using namespace std ;
int minnum(vector<pair<int,int>> , pair<int,int>);
int main()
{
vector<pair<int,int>> vec0 ;
vector<pair<int,int>> vec1 ;
int n ,m ;
cin >> n ;
cin >> m ;
pair<int,int> pro ;
for (int i = 0 ; i < n ; i++)
{
string str ;
cin >> str ;
for (int j = 0 ; j < m ; j++)
{
pro = make_pair(i,j);
if (str.at(j) == '0')
{
vec0.push_back(pro);
}
else
{
vec1.push_back(pro);
}
}
}
sort (vec0.begin(),vec0.end());
sort (vec1.begin(),vec1.end());
int a[800][800] = {0};
for (int i = 0 ; i < vec0.size() ; i++)
{
a[vec0.at(i).first][vec0.at(i).second] = 0 ;
}
for (int j = 0 ; j < vec1.size() ; j++)
{
a[vec1.at(j).first][vec1.at(j).second] = minnum(vec0,vec1.at(j));
}
for (int i = 0 ; i <n ; i++)
{
for (int j = 0 ; j < m ;j++)
{
cout << a[i][j]<<" ";
}
if (i!= (n-1))
cout << endl ;
}
return 0 ;
}
int minnum(vector<pair<int,int>> vec, pair<int,int> p)
{
vector<int> num ;
for (int i = 0 ; i < vec.size() ; i++)
{
int number ;
number = abs((vec.at(i).first-p.first))+abs((vec.at(i).second - p.second));
num.push_back(number);
}
sort (num.begin(),num.end());
return num.at(0);
}
大体思路,就是把0点存放在一个数组,1点存放在一个数组,然后将1点的数组中的元素减去0数组的元素求取最小值。但是只得了50分,what ! 原来是超出时间了,一定是复杂度太高了。
经过查看大神的代码1:https://www.cnblogs.com/weeping/p/6541432.html
经过查看大神的代码2:http://www.dotcpp.com/blog/9134-3.html
经过查看大神的代码3:http://www.dotcpp.com/blog/8945-5.html
好吧,好像是个bfs问题,啥是bfs,原来是广度搜索。让我思考一下,有时间写博客发表。