白駿2589:宝島
https://www.acmicpc.net/problem/2589
は最終的に2つの最も遠い点の問題であり、「最も長い」距離の問題ではBFSが最も適切である.(一歩一歩移動するので、最長または最短距離を求める場合はBFSが望ましい) 初期地図を入力し、地図の値をBFSで1加算し、最大値を選択すればよい. の総変数値は小さいので,すべてのL値に対してBFSを求めた.入場するたびに初期マップ値がコピーされます. +2 Dアレイのコピーにはcopyが使用されています.
+初期カウント値を0に設定して解き、0に設定すると他のエラーが発生するため1に設定し、最後に1を削除します.初期カウントとL値の区別が難しいためかもしれません.
1.近接
+初期カウント値を0に設定して解き、0に設定すると他のエラーが発生するため1に設定し、最後に1を削除します.初期カウントとL値の区別が難しいためかもしれません.
2.私の回答
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int n, m;
int map[51][51];
int input[51][51];
bool visited[51][51];
int maxval = 0;
int dc[4] = { -1,1,0,0 };
int dr[4] = { 0,0,-1,1 };
void BFS(int x, int y) {
queue<pair<pair<int, int>, int>> q;
q.push(make_pair(make_pair(x, y), 1));
visited[x][y] = true;
while (!q.empty()) {
int c = q.front().first.first;
int r = q.front().first.second;
int count = q.front().second;
q.pop();
if (count > maxval) maxval = count;
for (int i = 0; i < 4; i++) {
int nc = c + dc[i];
int nr = r + dr[i];
if (nc >= 0 && nc < n && nr>=0 && nr < m) {
if (map[nc][nr] ==0&&!visited[nc][nr]) {
q.push(make_pair(make_pair(nc, nr), count + 1));
map[nc][nr] = count + 1;
visited[nc][nr] = true;
}
}
}
}
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++) {
string tem;
cin >> tem;
for (int j = 0; j < m; j++) {
if (tem[j] == 'W') input[i][j] = -1;
else if (tem[j] == 0) input[i][j] = 0;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (input[i][j]==0) {
copy(&input[0][0], &input[0][0] + 51*51, &map[0][0]);
memset(visited, false, sizeof(visited));
BFS(i, j);
}
}
}
cout << maxval-1<< "\n";
return 0;
}
Reference
この問題について(白駿2589:宝島), 我々は、より多くの情報をここで見つけました https://velog.io/@jeongopo/백준-2589-보물섬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol