这是要捶打出题人的一集

我想问一下,一道题除了 deque其他地方都用纯C语言的写法,在BFS流程优化到最优的情况下都要跑800ms,给出1s时限又是因为什么呢?莫非有什么更快更巧妙的方法吗???

这道题我调了半个下午了,但是主要都是用来优化常数的,终于不是十连重测变成TLE了 QAQ…… alt

代码附在下面(已删去除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 ;
}