```
#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;
}
```
**这个能过大多数,少部分过不了,但我不知道测试数据**