rt。被 Hack 的题解为现题解区第一篇。Hack 数据一组:
30
23 7
23 27
14 1 12 0 36 17 23 13 21 0 30 0 13 6 26 36 34 13 19 27 35 15 36 8 36 30 35 34 5 0
正确输出:
16
题解输出:
18
错误原因:考虑如图情况情况
OOOO
OOOOOO
OOOOXOOOO
OOOOOOO
OOO
其中,O 表示光标空,S 表示光标起点。那么,按照题解的做法,第 2、3、4 行的末尾是不会被放进优先队列的,有可能被其他点更新的时候不优于是寄掉。改一改就可以了。
错误代码示范示例:
for(int i=sr-1,j=sc;i>=1;i--){
if(j>=a[i]+1){
j=a[i]+1,dis[i*2]=sr-i;
q.push(make_pair(-dis[i*2],i*2));
}
}
for(int i=sr+1,j=sc;i<=n;i++){
if(j>=a[i]+1){
j=a[i]+1,dis[i*2]=i-sr;
q.push(make_pair(-dis[i*2],i*2));
}
}
正确代码示范:
for(int i=sr-1,j=sc;i>=1;i--){
if(j>=a[i]+1){
j=a[i]+1,dis[i*2]=sr-i;
q.push(make_pair(-dis[i*2],i*2));
} else if(j==sc){
dis[i*2]=sr-i+a[i]+1-sc;
q.push(make_pair(-dis[i*2],i*2));
}
}
for(int i=sr+1,j=sc;i<=n;i++){
if(j>=a[i]+1){
j=a[i]+1,dis[i*2]=i-sr;
q.push(make_pair(-dis[i*2],i*2));
} else if(j==sc){
dis[i*2]=i-sr+a[i]+1-sc;
q.push(make_pair(-dis[i*2],i*2));
}
}
区别很明显。