zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    C# 图像处理:记录图像处理时间的一个类
    C# 图像处理:将图像(24位真彩)转为 8位灰度图像 采用了内存法,大大提高了效率
    C# 图像处理:复制屏幕到内存中,拷屏操作
    C# 图像处理:Bitmap 与 Image 之间的转换
    C# 图像处理:获取鼠标位置信息(全局)
    C# Liseview的使用方法之一:滚动到选中的行
    C# windows服务:如何获取服务程序所在的文件夹
    C#自制Web 服务器开发:mysql免安装版配置步骤详解分享
    C#自制Web 服务器开发:用C#开发自己的Web服务器
    ROS:ROS操作类MK.cs
  • 原文地址:https://www.cnblogs.com/yohaha/p/5341017.html
Copyright © 2011-2022 走看看