列表

详情


NC210359. 露营

描述

志摩凛是一个在爷爷的影响下开始露营的独自露营者。

露营是一种体验自然的美好享受,但是也难免遭遇困难,特别在一些人工管理不是很充足的露营地更是如此。

为了收集露营地的一些信息,往往需要询问一些过来人。

已知露营地可以用一个  的矩阵表示,且地图上任意相邻的两个点高度差都恰好为 1 (若两个格点共有一条边则他们相邻),志摩凛想知道每一点的地形高度来保障露营生活的正常展开。

她收集了 k 条信息,第 i 条信息表示 (x_i,y_i) 处的高度为 h_i

请你帮她还原出一种符合所有已有信息的地图,或者告诉她已有的信息中一定有一些是错误的。

输入描述

第一行输入两个整数 n, m (),表示露营地是一个  的场地。 

第二行输入一个整数 k (),表示收集到的信息。 

后面 k 行每行输入三个整数 x_i,y_i,h_i,(),表示坐标为 (x_i,y_i) 的地点高度为 h_i

输入数据保证对于 

输出描述

如果不存在一种合法的方案,在一行输出 No 。

否则在一行输出 Yes。接下来输出一个的矩阵表示露营地各点的高度,并且每个点的高度

如果有多种方案,任意输出其中一种即可。

示例1

输入:

3 3
2
1 1 0
2 2 2

输出:

Yes
0 1 2
1 2 3
2 3 4

示例2

输入:

2 2
2
1 1 1
1 2 -1

输出:

No

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 38ms, 内存消耗: 6744K, 提交时间: 2020-08-07 18:12:58

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
vector<vector<int>> g;
int n, m, k;
struct point {
    int x, y, h;
    bool operator<(const point& b) const { return h < b.h; }
};
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> k;
    g.resize(n + 1);
    for (int i = 0; i <= n; i++) {
        g[i].resize(m + 1);
        for (auto& x : g[i]) x = inf;
    }
    priority_queue<point> q;
    for (int i = 0, x, y, h; i < k; i++) {
        cin >> x >> y >> h;
        g[x][y] = h;
        q.push({x, y, h});
    }
    if (k == 0) q.push({1, 1, 0});
    point now;
    while (!q.empty()) {
        now = q.top();
        q.pop();
        int x = now.x, y = now.y, h = now.h;
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx < 1 || ny < 1 || nx > n || ny > m) continue;
            if (g[nx][ny] == inf) {
                g[nx][ny] = h - 1;
                q.push({nx, ny, h - 1});
            }
            else if (abs(g[nx][ny] - h) > 1) {
                cout << "No\n";
                return 0;
            }
        }
    }
    cout << "Yes\n";
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) cout << g[i][j] << ' ';
        cout << '\n';
    }
}

C++14(g++5.4) 解法, 执行用时: 49ms, 内存消耗: 6412K, 提交时间: 2020-08-05 22:46:14

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1e5+5,inf=1e9,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
typedef pair<int,int> pii;
vector<vector<int>> a;
priority_queue<pair<int,pair<int,int>>> q;
int main(){
    int i,n,m,k;
    int x,y,h;
    int flg=-1;
    scanf("%d%d",&n,&m);
    a.resize(n);
    for (auto &v:a){
        v.resize(m);
        for (auto &h:v)
            h=-inf;
    }
    scanf("%d",&k);
    for (i=0;i<k;i++){
        scanf("%d%d%d",&x,&y,&h);
        a[x-1][y-1]=h;
        q.push(make_pair(h,make_pair(x-1,y-1)));
    }
    if (q.empty()){
        a[0][0]=0;
        q.push(make_pair(0,make_pair(0,0)));
    }
    while (q.size()){
        auto t=q.top(); q.pop();
        int h=t.first,x=t.second.first,y=t.second.second;
        for (int d=0;d<4;d++) if (x+dx[d]>=0&&x+dx[d]<n&&y+dy[d]>=0&&y+dy[d]<m){
            if (a[x+dx[d]][y+dy[d]]==-inf){
                a[x+dx[d]][y+dy[d]]=h-1;
                q.push(make_pair(h-1,make_pair(x+dx[d],y+dy[d])));
            }
            else if (abs(a[x+dx[d]][y+dy[d]]-h)>1){
                puts("No"); return 0;
            }
        }
    }
    puts("Yes");
    for (int i=0;i<n;i++) for (int j=0;j<m;j++) printf("%d%c",a[i][j],j<m-1?' ':'\n');
    return 0;
}

上一题