网站降权是什么意思,网站设计资料,网站建设与网站设计,广州建筑股份有限公司官网题目大意#xff1a; 中山市的地图是一个n*n的矩阵#xff0c;其中标号为1的表示商业区#xff0c;标号为0的表示居民区。为了考察市内居民区与商业区的距离#xff0c;并对此作出评估#xff0c;市长希望你能够编写一个程序完成这一任务。 居民区i到商业区的距离指的是… 题目大意 中山市的地图是一个n*n的矩阵其中标号为1的表示商业区标号为0的表示居民区。为了考察市内居民区与商业区的距离并对此作出评估市长希望你能够编写一个程序完成这一任务。 居民区i到商业区的距离指的是到距离它最近的商业区j的距离(|Xi-Xj||Yi-Yj|)而你将统计的是对于城市中的每一个区域k以它为中心所有满足max(|Xk-Xm|,|Yk-Ym|)r的区域m到商业区距离之和。结果同样以n*n的矩阵形式输出。 思路 70分 O(n4)直接暴力求解即可。 100分 BFS 首先在读入的时候若这个点是商业区就先将它入队之后跑一边BFS求出每个居民区到商业区的距离由于每个点只要访问1次所以时间复杂度为O(n2)之后用二维前缀和加速输出每个位置的答案。总时间复杂度为O(tn2)。 代码 1 #include cstdio2 #include iostream3 #include cstring4 using namespace std;5 6 const int dx[]{0,0,0,1,-1};7 const int dy[]{0,1,-1,0,0};8 int a[301][301],b[301][301],p[301][301],t,n,r,sum,head,tail,state[500001][3];9
10 int abs(int x)
11 {
12 if (x0) return x;
13 return -x;
14 }
15
16 int minn(int x)
17 {
18 return min(x,n);
19 }
20
21 int maxn(int x)
22 {
23 return max(x,0);
24 }
25
26 void bfs()
27 {
28 do
29 {
30 head;
31 for (int i1;i4;i) //向四个方向扩展
32 {
33 int xxstate[head][1]dx[i];
34 int yystate[head][2]dy[i];
35 if (xx0||xxn||yy0||yyn||p[xx][yy]) continue;
36 tail; //入队
37 p[xx][yy]1;
38 state[tail][1]xx;
39 state[tail][2]yy;
40 b[xx][yy]b[state[head][1]][state[head][2]]1;
41 }
42 }
43 while (headtail);
44 return;
45 }
46
47 int main()
48 {
49 scanf(%d,t);
50 while (t--)
51 {
52 memset(b,0,sizeof(b));
53 memset(a,0,sizeof(a));
54 memset(p,0,sizeof(p));
55 scanf(%d%d,n,r);
56 for (int i1;in;i)
57 for (int j1;jn;j)
58 {
59 scanf(%d,a[i][j]);
60 a[i][j];
61 if (a[i][j]2) //商业区
62 {
63 tail; //入队
64 state[tail][1]i;
65 state[tail][2]j;
66 p[i][j]1;
67 }
68 }
69 bfs();
70 for (int i1;in;i)
71 for (int j1;jn;j)
72 b[i][j]b[i-1][j]b[i][j-1]-b[i-1][j-1]; //前缀和
73 for (int i1;in;i)
74 {
75 for (int j1;jn;j)
76 printf(%d ,b[minn(ir)][minn(jr)]-b[maxn(i-r-1)][minn(jr)]-b[minn(ir)][maxn(j-r-1)]b[maxn(i-r-1)][maxn(j-r-1)]);
77 putchar(10);
78 }
79 putchar(10);
80 }
81 return 0;
82 } 转载于:https://www.cnblogs.com/hello-tomorrow/p/9314772.html