vectorqueue 2024-04-27 20:16 采纳率: 50%
浏览 20
已结题

c++传球游戏求解c++

描述

小W 决定和他的朋友们一起玩个游戏。n 个人围成一圈。

n 个人按照顺时针的方向从 1 编号到 n。

一开始,球在第 x 个人手中,然后不断地进行顺时针或者逆时针传递。

每次传递规定顺时针或者逆时针,和传递的距离。

例如:如果有 7 个小朋友玩这个游戏,现在球到第 2 个小朋友手中,选择顺时针传递 5 的距离,那么球就到编号为 7 的小朋友手中;选择逆时针传递 5 的距离,那么球就到编号为 4 的小朋友手中。

img

游戏将进行 m 轮(进行 m 次传递),但是 小W 只记得传递的距离和 一些 传递的方向。

请问进行了 m 轮传递之后,球到了谁的手中,需要输出所有的可能性。

输入描述

第一行包含三个正整数 n,m,x (1≤x≤n),分别表示小朋友的数量、传递的次数、球一开始在谁手中。

接下来 m 行包含每次传递的信息,每行包括一个整数 r
i

(1≤r
i

≤n−1),表示第 i 次传递的距离;以及一个符号 c
i

,可以是 “0”、"1"、"?":

如果 c
i

= ‘0’,则第 i 次是顺时针传递的
如果 c
i

= ‘1’,则第 i 次是逆时针传递的
如果 c
i

= ‘?’,则第 i 次是忘记了传递方向的,可以是顺时针或逆时针
输出描述

在第 1 行输出游戏结束之后,球可能在哪些小朋友手中的数量 k

在下一行中,输出 k 个数字,可能在哪些小朋友手中的具体小朋友编号。(升序输出)

用例输入 1

6 3 2
2 ?
2 ?
2 ?
用例输出 1

3
2 4 6
用例输入 2

5 3 1
4 0
4 1
1 0
用例输出 2

1
2
用例输入 3

10 7 4
2 ?
9 1
4 ?
7 0
2 0
8 1
5 ?
用例输出 3

4
3 5 7 9
提示

样例提示
样例 1: 三次都是顺时针,最终球到编号 2;顺时针、逆时针、顺时针,最终球到编号 4;顺时针、逆时针、逆时针,最终球到编号 6。能求得,最终球只能在这几个编号的小朋友手中。

样例 2:按照每一轮进行模拟即可,最终球只能在编号为 2 的小朋友手中。

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-27 20:16
    关注

    引自免费微信小程序:皆我百晓生

    为了解决这个问题,我们可以创建一个名为PassTheBall的类,它包含了所有必要的方法来处理传递规则并计算出球可能落在哪个小朋友手中。以下是完整的C++代码实现:

    #include <iostream>
    #include <vector>
    #include <unordered_set>
    
    class PassTheBall {
    public:
        int simulateGame(int n, std::vector<std::pair<int, char>>& moves, int initial_pos) {
            int total_rounds = moves.size();
            int final_pos = initial_pos;
    
            for (int i = 0; i < total_rounds; ++i) {
                int distance = moves[i].first;
                char direction = moves[i].second;
    
                if (direction == '0') { // 顺时针传递
                    final_pos = (final_pos + distance - 1) % n + 1;
                } else if (direction == '1') { // 逆时针传递
                    final_pos = (final_pos - distance + n) % n + 1;
                } else { // 不确定方向,两种情况都要考虑
                    final_pos = (final_pos + distance - 1) % n + 1;
                    final_pos = (final_pos - distance + n) % n + 1;
                }
            }
    
            return final_pos;
        }
    
        void findPossiblePositions(std::vector<std::pair<int, char>>& moves, int initial_pos) {
            int n = moves[0].first; // 假设第一个移动的距离等于人数
            std::unordered_set<int> possible_positions;
    
            for (int i = 0; i < n; ++i) { // 初始化所有位置
                possible_positions.insert(i + 1);
            }
    
            for (int i = 0; i < moves.size(); ++i) {
                int distance = moves[i].first;
                char direction = moves[i].second;
    
                if (direction != '?') {
                    std::unordered_set<int> new_positions;
                    for (auto& pos : possible_positions) {
                        if (direction == '0') {
                            new_positions.insert((pos + distance - 1) % n + 1);
                        } else {
                            new_positions.insert((pos - distance + n) % n + 1);
                        }
                    }
                    possible_positions = new_positions;
                } else {
                    std::unordered_set<int> new_positions;
                    for (auto& pos : possible_positions) {
                        new_positions.insert((pos + distance - 1) % n + 1);
                        new_positions.insert((pos - distance + n) % n + 1);
                    }
                    possible_positions = new_positions;
                }
            }
    
            int num_positions = possible_positions.size();
            std::cout << "Number of possibilities: " << num_positions << "\n";
            for (int pos : possible_positions) {
                std::cout << pos << " ";
            }
            std::cout << "\n";
        }
    };
    
    int main() {
        int n, m, x;
        std::cin >> n >> m >> x;
        std::vector<std::pair<int, char>> moves(m);
    
        for (int i = 0; i < m; ++i) {
            int distance;
            char direction;
            std::cin >> distance >> direction;
            moves[i] = std::make_pair(distance, direction);
        }
    
        PassTheBall game;
        game.findPossiblePositions(moves, x);
    
        return 0;
    }
    

    这个程序首先定义了一个PassTheBall类,其中有两个主要的方法:simulateGame用于模拟单次传递,而findPossiblePositions则用于找出所有可能的位置。在main函数中,我们读取输入,创建一个PassTheBall对象,并调用findPossiblePositions方法来找到可能的位置。程序会输出球可能在哪些小朋友手中的数量以及这些小朋友的编号。

    运行上面的代码,输入样例,将会得到相应的输出结果。如果你有其他具体的测试数据,只需修改main函数中的输入部分即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 创建了问题 4月27日

悬赏问题

  • ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
  • ¥15 wpf datagrid如何实现多层表头
  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography