タイトル説明
考え
この質問は見始めている、非常に意志ではなく、一緒に統計やBFSを発行したい人、何の状態の始まりは、状態の終わりには、存在しないん、最短の単語のようにもタイトルが表示されませんでした。
そして、統計まあ、タイトルは正方形は同じ高さと言い、チームの同じ高さに通じ、この点を中心に読んでポイントを入れて、ポイントと同じ高さには顕著なブラウジングをマークされています。その後、我々は統計を望むもの、それはより小さく、また、それよりも大きいがあり、これはそれよりもほんの小さな、我々は答えをカウントする点の高さではない、またはそれよりも唯一の大きな両方、プロセスを参照してください。 A。2つのマークは、それよりも大きいがあるより小さいマーキングプロセスを参照して、提供されてもよいです。
そして、その後、すべてが1を追加し、2つのマークが満たされていないので、非常に時間の1つだけです。
フラッディング方法も解決できる方法があるかのように、それは、DFSとBFSが行うことができます。このトピック感じです。
そして、BFSルーチン文句を言うが、単純なDFSに比べて、ありました、書きやすいDFSが、それぞれの層は、剪定など、qwqと相まって、より困難な状態を表しているか......
コード
#include <cstdio>
#include <cstring>
#include <queue>
int n;
int mp[1005][1005], vis[1005][1005], obs[1005][1005];
int dirx[] = {0, -1, -1, -1, 0, 1, 1, 1, 0};
int diry[] = {0, -1, 0, 1, 1, 1, 0,-1,-1};
struct Node {
int x, y;
} tmp, cur;
std::queue<Node> q;
int lows, highs;
inline int read() {
int s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * f;
}
bool valid(int x, int y) {
if (x < 1 || x > n) return false;
if (y < 1 || y > n) return false;
return true;
}
void bfs(int x, int y) {
while (!q.empty()) q.pop();
tmp.x = x, tmp.y = y;
q.push(tmp);
vis[x][y] = 1;
int z = mp[x][y];
bool low = false, high = false;
while (!q.empty()) {
cur = q.front();
q.pop();
for (int i = 1; i <= 8; ++i) {
tmp.x = cur.x + dirx[i];
tmp.y = cur.y + diry[i];
if (valid(tmp.x, tmp.y)) {
int tz = mp[tmp.x][tmp.y];
if (tz < z) low = true;
if (tz > z) high = true;
if (tz == z && !vis[tmp.x][tmp.y]) {
q.push(tmp);
vis[tmp.x][tmp.y] = 1;
}
}
}
}
if (!low) lows++;
if (!high) highs++;
}
int main() {
n = read();
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
mp[i][j] = read();
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (!vis[i][j]) bfs(i, j);
}
}
printf("%d %d", highs, lows);
return 0;
}