Titellink: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1578
Thema
Ein Sitztisch mit einer Länge von n und einer Breite von m hat k Geräuschquellen, die Geräusche mit einem Geräuschwert von s erzeugen. Sein Einfluss auf die Umgebung nimmt je nach Abstand stark ab. Der Abstand zwischen zwei Punkten ist die Summe der Absolutwerte der Abszisse und Ordinatendifferenzen. Fragen Sie, wo der Rauschwert am kleinsten ist, der gleiche kleine Ausgang i klein ist und der gleiche Ausgang j klein ist
范围 : (0 <n, m <100,0 <= k <= n * m, 0 <= i <n, 0 <= j <m, 0 <s <10)
Ideen
Führen Sie bfs direkt auf der Geräuschquelle aus! Zuerst hatte ich das Gefühl, dass die Tiefe bis zu 10 betrug, nicht groß, jedes BFS konnte nicht viel laufen, und dann höchstens 1e4 BFS, und am Ende mehrere Schüsse, woo woo woo (das vis-Array muss jedes Mal gelöscht werden, 1e4 1e4 Operationen, natürlich t).
Tatsächlich können Sie O (n ^ 2) direkt aufzählen, ohne bfs zu verwenden, ausführen, wo die aktuelle Rauschquelle Einfluss haben kann, und dann den Rauschwert an diesem Punkt direkt ändern.
AC-Code
#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;
}