一道算法题,求助,直接使用bfs会超时

```

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>


#define x first
#define y second

using namespace std;
const int N = 3010;
typedef pair<int,int> PII;

int dx[8] = {1,0,-1,0,1,-1,-1,1},dy[8] = {0,1,0,-1,1,1,-1,-1};
bool st[N][N];
int dist[N][N];
int n,m,p;
int g[N][N];
vector<PII> water;

void bfs(){
    queue<PII> q;
    // 将所有的水源的点全部放进去
    for (int  i= 0 ;i < water.size();i++) {
        PII p = water [i];
        
        q.push(p);
        // 塞进去之后同时
        dist[p.x][p.y] = 0;
        st[p.x][p.y] = true;
    }
    
    while(q.size()){
        PII p = q.front();
        q.pop();
        int ix = p.x;
        int iy = p.y;
        for (int i = 0;i < 8;i++){
            int tx = ix + dx[i];
            int ty = iy + dy[i];
            // 不合法的坐标
            if (tx > n || tx < 1 || ty > n || ty < 1) continue;
            if (st[tx][ty]) continue;
            // 说明没有走过
            dist[tx][ty] = dist[ix][iy] + 1;
            st[tx][ty] = true;
            PII node;
            node.x = tx;
            node.y = ty;
            q.push(node);
        }
        
    }
}


int main (){
    // 读入三个数
    scanf("%d%d%d",&n,&m,&p);
    
    // 毒蛇在的位置
    while (m--){
        int x,y;
        scanf("%d%d",&x,&y);
        g[x][y] = 1;
        st[x][y] = true;
        dist[x][y] = -1;
    }
    while (p--) {
        int x,y;
        scanf("%d%d",&x,&y);
        PII c;
        c.x= x;
        c.y= y;
        water.push_back(c);
    }
    bfs();
    int res =0;
    for (int i = 1;i <= n;i++) {
        for (int j = 1;j <= n;j++) {
            if (st[i][j])
                res += dist[i][j];
            else res --;
        }
    }
    cout << res << endl;
    
    return 0;
}

 

```

**这个能过大多数,少部分过不了,但我不知道测试数据**