这是要捶打出题人的一集
我想问一下,一道题除了 deque其他地方都用纯C语言的写法,在BFS流程优化到最优的情况下都要跑800ms,给出1s时限又是因为什么呢?莫非有什么更快更巧妙的方法吗???
这道题我调了半个下午了,但是主要都是用来优化常数的,终于不是十连重测变成TLE了 QAQ……
代码附在下面(已删去除deque外所有用到的STL,以及对BFS进行充分剪枝,避免不必要的流程)
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std ;
const int N = 1010 ;
int mov[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}} ;
char c[N][N] ;
int dist[N][N] ;
struct node {
int x , y , dist ;
};
signed main() {
int n , m ; scanf("%d %d", &n, &m) ;
for(int i=1 ; i<=n ; i++)
for(int j=1 ; j<=m ; j++) {
scanf(" %c " , &c[i][j]) ;
}
int q ; scanf(" %d ", &q) ;
while(q--) {
int s[2] , t[2] ;
scanf("%d %d %d %d", &s[0], &s[1], &t[0], &t[1]) ;
for(int i=1 ; i<=n ; i++)
for(int j=1 ; j<=m ; j++)
dist[i][j] = 0x3f3f3f3f ;
deque<node> que ;
que.push_back({s[0],s[1],0}) ;
while(!que.empty()) {
node tp = que.front() ; que.pop_front() ;
if(tp.dist > dist[tp.x][tp.y]) continue ;
if(tp.x==t[0] && tp.y==t[1]) {
cout << tp.dist <<endl ;
break ;
}
for(int i=0 ; i<8 ; i++) {
int x = tp.x+mov[i][0] , y = tp.y+mov[i][1] ;
if(x<1||x>n||y<1||y>m) continue ;
if(i==c[tp.x][tp.y]-'0' && dist[x][y]<=tp.dist ) continue ;
if(i!=c[tp.x][tp.y]-'0' && dist[x][y]<=tp.dist+1 ) continue ;
if(c[tp.x][tp.y]!=i+'0') {
dist[x][y] = tp.dist+1 ;
que.push_back({x,y,tp.dist+1}) ;
}
else {
dist[x][y] = tp.dist ;
que.push_front({x,y,tp.dist}) ;
}
}
}
}
return 0 ;
}