Talk is cheap. Show me the code. —— Linus Torvalds
Hints:
曼哈顿距离:两点各轴坐标之差的和。
根据题目求出一个样例中,所有(1, 3)点对的最短曼哈顿距离之中最大的那个即可。
解析:
因为主人公是随机选取1号落脚点,那么任意1, 3之间的最短距离最大的那个即可代表答案,这样其他的1, 3之间的距离都只能小于这个值。
这道题我有试着用STL队列实现广度优先搜索来做,但却超时,可能队列操作成本总和太大了,有兴趣的可以自行实现一个队列来尝试。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAX = 10010;
char arr[MAX][MAX];
int main()
{
int n, minimum, max = -1, ans; while(scanf("%d", &n) == 1) {
getchar();for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)scanf("%c", &arr[i][j]);getchar();}max = -1;for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(arr[i][j] == '1'){
minimum = 99999999;for(int k = 0; k < n; k++){
for(int l = 0; l < n; l++){
if(k == i && l == j) continue;if(arr[k][l] == '3'){
ans = abs(k - i) + abs(l - j);if(ans < minimum) minimum = ans;}}if(minimum > max) max = minimum;}}}printf("%d\n", max); }return 0;
}