山と谷山と谷

タイトル説明

考え

この質問は見始めている、非常に意志ではなく、一緒に統計や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;
}

おすすめ

転載: www.cnblogs.com/liuzz-20180701/p/11610243.html