제목 링크 : 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 개라고 느꼈습니다. 각 BF는 많이 달릴 수 없었고, 1e4 BF는 최대 1e4 BF뿐이었습니다. 결국 몇 번의 샷, woo woo woo (비스 어레이는 매번 지워야합니다. 1e4 1e4 작업, 물론 t).
실제로 bfs를 사용하지 않고 O (n ^ 2)를 직접 열거하고 현재 노이즈 소스가 영향을 미칠 수있는 곳에서 실행 한 다음 해당 지점에서 직접 노이즈 값을 수정할 수 있습니다.
ac 코드
#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;
}