2 条题解

  • 0
    @ 2024-12-15 9:44:24

    bfs代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    // 定义 BFS 函数
    int bfs(const string &start_str, const vector<pair<int, int>> &rule) {
        int cnt = 1; // 初始化计数器
        int len = start_str.size();
        queue<string> q;
        unordered_set<string> vised; // 存储已经访问过的字符串
    
        q.push(start_str);
        vised.insert(start_str);
    
        while (!q.empty()) {
            string node = q.front();
            q.pop();
            for (auto &rr : rule) {
                char from = rr.first + '0';
                char to = rr.second + '0';
                for (int i = 0; i < len; i++) {
                    if (node[i] == from) {
                        string new_node = node;
                        new_node[i] = to;
                        if (vised.find(new_node) == vised.end()) {
                            q.push(new_node);
                            vised.insert(new_node);
                            cnt++;
                        }
                    }
                }
            }
        }
        return cnt;
    }
    
    int main() {
        string str;
        cin >> str;
        int k;
        cin >> k;
        vector<pair<int, int>> rule(k);
        for (int i = 0; i < k; i++) {
            cin >> rule[i].first >> rule[i].second;
        }
        int cnt = bfs(str, rule); // 调用 BFS 函数
        cout << cnt;
        return 0;
    }
    
    
    • 0
      @ 2024-12-5 15:45:53

      100分代码:

      #include <bits/stdc++.h>
      using namespace std;
      int main() {
          string s;
          int k;
          // 输入初始数字
          cin >> s;
          int len = s.size();
          // 输入转换规则
          cin >> k;
          vector<pair<int, int>> rules(k);
          for (int i = 0; i < k; i++) {
              cin >> rules[i].first >> rules[i].second;
          }
          // 使用队列和集合
          queue<string> q;
          unordered_set<int> visited;
      
          // 初始化队列和访问集合
          q.push(s);
          visited.insert(stoi(s));
          int cnt = 1; // 初始包含原数
          // 广度优先搜索
          while (!q.empty()) {
              string current = q.front();
              q.pop();
              for (const auto &rule : rules) {
                  char from = rule.first + '0';
                  char to = rule.second + '0';
      
                  // 对当前数字的每个字符进行尝试替换
                  for (int i = 0; i < len; i++) {
                      if (current[i] == from) {
                          string next = current;
                          next[i] = to;
                          int next_val = stoi(next);
                          if (visited.find(next_val) == visited.end()) {
                              visited.insert(next_val);
                              q.push(next);
                              cnt++;
                          }
                      }
                  }
              }
          }
          // 输出不同整数的个数
          cout << cnt << endl;
          return 0;
      }
      
      
      • 1

      信息

      ID
      839
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      40
      已通过
      6
      上传者