京东8.19笔试

选择题一堆不会,开摆。算法ak。

第一题

给一个井字棋的局面,问a和b谁赢了,亦或是平局

#include <bits/stdc++.h>
using namespace std;
void solve() {
  string s[3];
  for (auto &x : s) cin >> x;
  auto valid = [&](int x, int y) { return x >= 0 && x < 3 && y >= 0 && y < 3; };
  int ans = 0;
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (s[i][j] == 'o') {
        if (valid(i - 1, j) && valid(i + 1, j) && s[i - 1][j] == '*' &&
            s[i + 1][j] == '*')
          ans |= 1;
        if (valid(i, j - 1) && valid(i, j + 1) && s[i][j - 1] == '*' &&
            s[i][j + 1] == '*')
          ans |= 1;
      } else if (s[i][j] == '*') {
        if (valid(i - 1, j) && valid(i + 1, j) && s[i - 1][j] == 'o' &&
            s[i + 1][j] == 'o')
          ans |= 2;
        if (valid(i, j - 1) && valid(i, j + 1) && s[i][j - 1] == 'o' &&
            s[i][j + 1] == 'o')
          ans |= 2;
      }
    }
  }
  if(ans==2) puts("yukari");
  else if(ans==1)puts("kou");
  else puts("draw");
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t = 1;
  cin >> t;
  while (t--) solve();
  return 0;
}

第二题

某人有不超过20个状态,然后有m种药,每个药能去掉某些状态,同时增加某些状态。现在按照某个顺序喝药,问喝了每种药之后有多少个状态。

#include <bits/stdc++.h>
using namespace std;
int cal(string s) {
  int ret = 0;
  for (auto x : s) {
    ret <<= 1;
    if (x == '1') ret++;
  }
  return ret;
}
void solve() {
  int n;
  cin >> n;
  int now = 0;
  string s;
  cin >> s;
  now = cal(s);
  int m;
  cin >> m;
  vector<array<int, 2>> v(m);
  for (auto &x : v) {
    for (auto &t : x) {
      cin >> s;
      t = cal(s);
    }
  }
  int q;
  cin >> q;
  while (q--) {
    int x;
    cin >> x;
    x--;
    now &= ~v[x][0];
    now |= v[x][1];
    cout << __builtin_popcount(now) << "\n";
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t = 1;
  // cin >> t;
  while (t--) solve();
  return 0;
}

第三题

n*m的图,初始在左上角,每次操作可以往右或往下或往右下行动若干格,问要多少次操作才能到右下角。

一开始看错题了,以为可以往左上走,然后写了个用set优化的bfs,然后发现只能往右下走,就纯bfs了。

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
void solve() {
  int n, m;
  cin >> n >> m;
  vector<string> v(n);
  for (auto &x : v) cin >> x;
  vector<vector<int>> dp(n, vector<int>(m, INF));
  dp[0][0] = 0;
  queue<array<int, 2>> q;
  q.push({0, 0});
  while (q.size()) {
    auto [i, j] = q.front();
    q.pop();
    for (int k = i + 1; k < n && v[k][j] != '*'; k++) {
      if (dp[k][j] <= dp[i][j]) break;
      dp[k][j] = dp[i][j] + 1;
      q.push({k, j});
    }
    for (int k = j + 1; k < m && v[i][k] != '*'; k++) {
      if (dp[i][k] <= dp[i][j]) break;
      dp[i][k] = dp[i][j] + 1;
      q.push({i, k});
    }
    for (int k = 1; i + k < n && j + k < m && v[i + k][j + k] != '*'; k++) {
      if (dp[i + k][j + k] <= dp[i][j]) break;
      dp[i + k][j + k] = dp[i][j] + 1;
      q.push({i + k, j + k});
    }
    if (dp.back().back() != INF) break;
  }
  int ans = dp.back().back();
  if (ans == INF) ans = -1;
  cout << ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t = 1;
  // cin >> t;
  while (t--) solve();
  return 0;
}

#京东信息集散地#
全部评论
只A了前两个,感觉第三个dp再有10分钟就有了
2 回复 分享
发布于 2023-08-19 12:06 上海
大佬tql,main函数里面的两个用于加快输入的能缩短多少时间呢?🤔️想了解下
1 回复 分享
发布于 2023-08-19 14:00 四川
选择题都考什么啊
点赞 回复 分享
发布于 2023-08-20 20:18 江苏
大佬,你是怎么想到解除症状的操作是去反在与操作的?
点赞 回复 分享
发布于 2023-08-19 18:36 江苏
大佬太强了
点赞 回复 分享
发布于 2023-08-19 13:52 台湾
第一题会输入很多组的情况怎么输入
点赞 回复 分享
发布于 2023-08-19 13:05 北京
牛逼,加个dp缓存继续bfs是没想到的
点赞 回复 分享
发布于 2023-08-19 12:39 上海
m
点赞 回复 分享
发布于 2023-08-19 12:24 广东
a了前两个,没时间写第三个了,亏麻😤
点赞 回复 分享
发布于 2023-08-19 12:05 湖南
最后一题是在改不动了,bfs卡在60,时间卡住了
点赞 回复 分享
发布于 2023-08-19 12:03 广东
第三题c++的bfs能过吗?我用Java50%超时了
点赞 回复 分享
发布于 2023-08-19 12:02 四川
佬强我菜
点赞 回复 分享
发布于 2023-08-19 12:01 北京

相关推荐

05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
评论
21
47
分享

创作者周榜

更多
牛客网
牛客企业服务