JavaW的技术专栏 A CSU coder

【LeetCode-16-22】解题报告(模拟,集合)

2021-09-23

C++

原始题目

一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时,网格全白,蚂蚁面向右侧。每行走一步,蚂蚁执行以下操作。

(1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并向前移动一个单位。

(2) 如果在黑色方格上,则翻转方格的颜色,向左(逆时针方向)转 90 度,并向前移动一个单位。

编写程序来模拟蚂蚁执行的前 K 个动作,并返回最终的网格。

网格由数组表示,每个元素是一个字符串,代表网格中的一行,黑色方格由 ‘X’ 表示,白色方格由 ‘_‘ 表示,蚂蚁所在的位置由 ‘L’, ‘U’, ‘R’, ‘D’ 表示,分别表示蚂蚁 左、上、右、下 的朝向。只需要返回能够包含蚂蚁走过的所有方格的最小矩形。

解题思路

无需维护整个地图状态,用一个点集合来维护黑色方格

解题代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

#define rep(i, a, n) for (int i = a; i < n; ++i)
#define per(i, a, n) for (int i = n - 1; i >= a; --i)
#define fi first
#define se second
#define pb push_back
#define np next_permutation
#define mp make_pair
#define all(x) x.begin(), x.end()


class Solution {
    public:
        vector<string> printKMoves(int K)
{
    int ax, ay;
    int dir[4][2] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
int dirid;
char mmp[4] = { 'L', 'U', 'R', 'D' };
set<pii> pos;
ax = ay = 0;
pos.clear();
dirid = 2;
rep(i, 0, K)
{
    if (pos.count(mp(ax, ay)) == 0) {
        // bai
        dirid = (dirid + 1) % 4;
        pos.insert(mp(ax, ay));
    } else {
        dirid = (dirid + 3) % 4;
        pos.erase(mp(ax, ay));
    }
    ax = ax + dir[dirid][0];
    ay = ay + dir[dirid][1];
}

int vx_max = ax;
int vx_min = ax;
int vy_max = ay;
int vy_min = ay;
for (auto i : pos) {
    vx_max = max(i.first, vx_max);
    vx_min = min(i.first, vx_min);
    vy_max = max(i.second, vy_max);
    vy_min = min(i.second, vy_min);
}
int rows = vy_max - vy_min + 1;
int cols = vx_max - vx_min + 1;
string temp;
for (int i = 0; i < cols; i++)
temp.push_back('_');
vector<string> ans(rows, temp);
for (auto it = pos.begin(); it != pos.end(); it++) {

    ans[it->second - vy_min][it->first - vx_min] = 'X';
}
ans[ay - vy_min][ax - vx_min] = mmp[dirid];

return ans;
}
};```
* 贪心
```typescript
class Solution {
public:
    int minDeletionSize(vector<string>& A)
    {
        int ans = 0;
        vi pos(A.size(), 0);
        rep(i, 0, A.front().size())
        {
            int flag = 0;
            rep(j, 1, A.size())
            {
                if (!pos[j] && A[j][i] < A[j - 1][i]) {
                    ans++;
                    flag = 1;
                    break;
                }
            }
            if (flag)
                continue;
            rep(j, 1, A.size())
            {
                if (A[j - 1][i] < A[j][i]) {
                    pos[j] = 1;
                }
            }
        }
        return ans;
    }
};

Comments

Content