我已经向this problem on spoj.com提交了一个解决方案,这个网站会出现问题,您可以提交解决方案然后进行判断并给出三个结果中的一个 - 接受,错误答案或超出时间限制。我正在处理的特殊问题有4秒的时间限制。
我的第一个解决方案使用std::vector
,如下所示:
#include<bits/stdc++.h>
using namespace std;
#define inf 10000000
typedef pair<int,int> pii;
int main()
{
int t,n,m;
cin>>t;
char str[200][200];
int dist[200][200];
while(t--)
{
cin>>n>>m;
for(int i=0;i<n;i++)
scanf("%s",str[i]);
set< pii > ms;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(str[i][j]=='1')
{ dist[i+1][j+1]=0; ms.insert( make_pair<int,int> (i+1,j+1)); }
else
dist[i+1][j+1]=inf;
}
}
int dis=0,rr,cc,p,q;
pii pi,temp;
pii nei[5];
while(ms.empty()==0) // bfs
{
pi=*ms.begin();
p=pi.first;
q=pi.second;
ms.erase(ms.begin());
vector< pii > v;
v.push_back(make_pair<int,int>(p,q));
while(!v.empty())
{
temp = *v.begin();
v.erase(v.begin());
nei[1].first=temp.first-1; nei[1].second=temp.second;
nei[2].first=temp.first+1; nei[2].second=temp.second;
nei[3].first=temp.first; nei[3].second=temp.second+1;
nei[4].first=temp.first; nei[4].second=temp.second-1;
for(int i = 1; i<=4; ++i)
{
rr=nei[i].first;
cc=nei[i].second;
if(rr>=1 && rr<=n && cc>=1 && cc<=m )
{
dis=abs(rr-p) + abs(cc-q);
if(dist[rr][cc] >dis)
{
dist[rr][cc]=dis;
v.push_back(make_pair<int,int>(rr,cc));
}
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%d ",dist[i][j]);
}
printf("\n");
}
} // end of test case
}
当我提交这个时,我得到了超过时间限制&#34;作为我的结果。但是,在ideone it gives the correct result in 0s上。
我的第二个解决方案使用std::queue
:
#include<bits/stdc++.h>
using namespace std;
#define inf 10000000
typedef pair<int,int> pii;
int main()
{
int t,n,m;
cin>>t;
char str[200][200];
int dist[200][200];
while(t--)
{
cin>>n>>m;
for(int i=0;i<n;i++)
scanf("%s",str[i]);
set< pii > ms;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(str[i][j]=='1')
{ dist[i+1][j+1]=0; ms.insert( make_pair<int,int> (i+1,j+1)); }
else
dist[i+1][j+1]=inf;
}
}
int dis=0,rr,cc,p,q;
pii pi,temp;
pii nei[5];
while(ms.empty()==0) // bfs
{
pi=*ms.begin();
p=pi.first;
q=pi.second;
ms.erase(ms.begin());
queue< pii > v;
v.push(make_pair<int,int>(p,q));
while(!v.empty())
{
temp = v.front();
v.pop();
nei[1].first=temp.first-1; nei[1].second=temp.second;
nei[2].first=temp.first+1; nei[2].second=temp.second;
nei[3].first=temp.first; nei[3].second=temp.second+1;
nei[4].first=temp.first; nei[4].second=temp.second-1;
for(int i = 1; i<=4; ++i)
{
rr=nei[i].first;
cc=nei[i].second;
if(rr>=1 && rr<=n && cc>=1 && cc<=m )
{
dis=abs(rr-p) + abs(cc-q);
if(dist[rr][cc] >dis)
{
dist[rr][cc]=dis;
v.push(make_pair<int,int>(rr,cc));
}
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%d ",dist[i][j]);
}
printf("\n");
}
} // end of test case
}
此解决方案也produces the correct answer in 0s on ideone并在spoj.com上被接受。
在这两种情况下,容器都像&#34;标准队列数据结构&#34;,无论是std::vector
还是std::queue
。任何人都可以解释为什么第一个可能被拒绝,因为太慢而第二个被接受了吗?
答案 0 :(得分:1)
如果您需要队列,请使用队列。
在使用向量&lt;&gt;的实现中,您在每次迭代时手动擦除向量的第一个元素,对向量执行代价高昂的操作(导致可能重新分配整个缓冲区),但不在队列上(设计)特别是对于这种类型的操作_前后修改)。
这解释了为什么基于矢量的实现速度较慢。