codeforces 659F . Polycarp and Hay 搜索

题目链接

遍历每个点, 如果这个点的值能被k整除并且k/a[i][j]后小于等于n*m, 那么就对这个点进行搜索。
将这个点加入队列, 将周围的所有大于等于这个点的值的点也加入队列。 不断重复, 直到队列空或者数量满足要求。
可以加一个额外的数组, 如果搜索的过程中, 这个值和a[i][j]相同, 那么就把这个格子标记, 减少额外的操作。

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <complex>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef complex <double> cmx;
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9+7;
const int inf = 1061109567;
const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
const int maxn = 1005;
int vis[maxn][maxn], a[maxn][maxn], used[maxn][maxn];
int n, m;
ll sum;
int solve() {
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            int cnt = 0;
            if(sum % a[i][j] == 0 && sum/a[i][j] <= n*m && !vis[i][j]) {
                queue <pll> q;
                q.push(mk(i, j));
                mem(used);
                while(!q.empty()) {
                    int x = q.front().fi, y = q.front().se;
                    q.pop();
                    if(used[x][y])
                        continue;
                    cnt++;
                    used[x][y] = 1;
                    if(cnt == sum/a[i][j]) {
                        return a[i][j];
                    }
                    for(int k = 0; k < 4; k++) {
                        int tmpx = x+dir[k][0];
                        int tmpy = y+dir[k][1];
                        if(tmpx<=0||tmpx>n||tmpy<=0||tmpy>m||a[tmpx][tmpy]<a[i][j]) {
                            continue;
                        }
                        if(a[tmpx][tmpy] == a[i][j]) {
                            vis[tmpx][tmpy] = 1;
                        }
                        q.push(mk(tmpx, tmpy));
                    }
                }
            }
        }
    }
    return -1;
}
int main()
{
    cin>>n>>m>>sum;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    int ans = solve();
    if(ans == -1) {
        puts("NO");
    } else {
        puts("YES");
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                if(used[i][j]) {
                    printf("%d ", ans);
                } else {
                    printf("0 ");
                }
            }
            puts(" ");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yohaha/p/5341017.html