Ссылка на заголовок: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1578
Тема
Стол-сиденье длиной n и шириной m имеет k источников шума, которые создают шум со значением шума s. Его влияние на окружающую среду резко уменьшается в зависимости от расстояния. Расстояние между двумя точками является суммой абсолютные значения разностей абсцисс и ординат. Спросите, где значение шума наименьшее, такой же малый выходной сигнал i мал и тот же выходной сигнал j мал
范围 : (0 <n, m <100,0 <= k <= n * m, 0 <= i <n, 0 <= j <m, 0 <s <10)
Идеи
Запустите bfs прямо на источнике шума! Сначала я почувствовал, что глубина до 10, небольшая, каждый бфс не может много работать, а потом максимум 1e4 бфс, а в конце несколько выстрелов, у-у-у (массив vis нужно очищать каждый раз, 1e4 операции 1e4 конечно t).
Фактически, вы можете напрямую перечислить O (n ^ 2) без использования bfs, запустить там, где может повлиять текущий источник шума, а затем напрямую изменить значение шума в этой точке.
код переменного тока
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ok(x, y) x >= 0 && x < n && y >= 0 && y < m //宏定义比调用函数快一点
int a[105][105];
int n, m;
int main(){
int k;
while(~scanf("%d%d%d", &n, &m, &k)){
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
a[i][j] = 0;
}
}
int x, y, s, dx, dy;
while(k --){
scanf("%d%d%d", &x, &y, &s);
a[x][y] += s;
for(int i = 1; i < s; i ++){ //这里要分开处理,不能放在下面的循环里面,因为a[x+0][y+j]和a[x-0][y+j]一样,会重复累加
if(ok(x, y + i)) a[x][y + i] += s - i;
if(ok(x, y - i)) a[x][y - i] += s - i;
if(ok(x + i, y)) a[x + i][y] += s - i;
if(ok(x - i, y)) a[x - i][y] += s - i;
}
for(int i = 1; i < s; i ++){
for(int j = 1; j < s; j ++){
if(i + j >= s) continue; //距离不能超过s,当然等于s的时候加0,也就不跑了
dx = x + i, dy = y + j;
if(ok(dx, dy)) a[dx][dy] += s - i - j;
dx = x + i, dy = y - j;
if(ok(dx, dy)) a[dx][dy] += s - i - j;
dx = x - i, dy = y + j;
if(ok(dx, dy)) a[dx][dy] += s - i - j;
dx = x - i, dy = y - j;
if(ok(dx, dy)) a[dx][dy] += s - i - j;
}
}
}
int ans = 0x3f3f3f3f, ansx, ansy;
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
if(ans > a[i][j]){
ansx = i, ansy = j;
ans = a[i][j];
}
}
}
printf("%d %d %d\n", ansx, ansy, ans);
}
return 0;
}