解决约瑟夫环的多种方法

算法科普:什么是约瑟夫环 1 问题描述 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。 例如:有10个人围成一圈进行此游戏,每个人编号为 1-10 。... 阅读详情
AI摘要

本文通过数组、链表、递归及动态规划等多种方法实现约瑟夫环问题,旨在帮助读者理解不同算法的应用场景,并提供丰富的代码实例。

1.开言

约瑟夫环问题(Josephus Problem)是一个既富有挑战性又非常有趣的题目。它不仅考察了算法的设计思维,还展示了数据结构的巧妙应用。

小白我在刷牛客竞赛语法入门班数组字符串习题遇到了遇到了这个经典问题。虽然最初被其复杂的逻辑困住,但经过深入学习并参考了一些大佬的详细题解后,我终于掌握了一些,像数组,循环链表还是有着些许的理解,不过像递归和动态规划还暂时未学会,因此本文并非对这一问题的全面解读,而是分享多种实现这一算法的代码,希望能够帮助初学者理解约瑟夫环问题,也为那些已经理解算法思路但忘记具体实现的大佬们提供一些快速参考。 

题目链接        https://ac.nowcoder.com/acm/contest/19306/1003

下面,让我们一起来探讨这个有趣的问题,并看看这些不同的解决方案。

2.C&C++数组解决方法

1.静态数组

#include <iostream>
using namespace std;
const int N = 100;
int josephus(int n,int m)
{
	int cirarr[N];
	int index = 0;// 从一个人开始, 若第k个人开始 k-1;
	int count = 0; // 计数器;
	for(int i=0;i<n;i++) // 初始化约瑟夫环
	{
		cirarr[i] = i+1;
	}
	while(n>1)// 模拟淘汰
	{
		count++;
		if(count == m)
		{
			for(int j=index;j<n-1;j++) //相当于顺序表删除元素操作;
			{
				cirarr[j] = cirarr[j+1];	
			}
			count = 0;// 重置计算器
			n-- ;// 人数减一
			index--;  //修正index以指向正确的下一个元素
		}
		index++; // 移向下一个人
		// 当到达约瑟夫环的末尾时,回到开始位置
    	if (index == n)
    	{
        	index = 0;
    	}	
	}
	return cirarr[0];// 最后未被淘汰的人编号;
}
int main()
{
	int n,m;
	int num;
	cout<<"请输入约瑟夫环的人数n : ";
	cin>>n;
	cout<<"请输入每次数的数字m : ";
	cin>>m;
	num = josephus(n,m);
	cout<<"最后未被淘汰的编号是 "<<num<<endl;
	return 0;
}

2.动态数组

1.C语言使用malloc来动态分配内存

#include <stdio.h>
#include <stdlib.h>
int josephus(int n, int k) {
    int* people = (int*)malloc(n * sizeof(int));
    int i, count = 0, position = 0, remaining = n;//剩余人数
    // 初始化约瑟夫环
    for (i = 0; i < n; i++) {
        people[i] = 1;  // 1表示人还在圈中
    }
    while (remaining > 1) {
        if (people[position] == 1) {
            count++;
            if (count == k) {
                people[position] = 0;  // 0表示此人被淘汰
                remaining--;
                count = 0;
                printf("第 %d 个人被淘汰\n", position + 1);
            }
        }
        position = (position + 1) % n;
    }
    // 找到最后幸存者
    for (i = 0; i < n; i++) {
        if (people[i] == 1) {
            free(people);
            return i + 1;  // 返回幸存者的编号(从1开始)
        }
    }
    free(people);
    return -1;  // 错误情况
}
int main() {
    int n, k;
    printf("请输入总人数 n: ");
    scanf("%d", &n);
    printf("请输入报数值 k: ");
    scanf("%d", &k);
    int survivor = josephus(n, k);
    printf("最后的幸存者编号是: %d\n", survivor);
    return 0;
}

 2.C++使用new创建动态数组

#include <iostream>
using namespace std;

int findKing(int n, int k, int m) {//报数报到m的人出队(报数是1,2,...m这样报的)
    int* people = new int[n];
    for (int i = 0; i < n; i++) {// 初始化
        people[i] = 1;  // 1 表示人在圈中,0 表示人已出局
    }
    
    int remaining = n;  // 剩余人数
    int index = k - 1;  // 当前报数的人的位置
    int step = 0;  // 当前报的数
    
    while (remaining > 1) {
        if (people[index] == 1) {
            step++;
            if (step == m) {
                people[index] = 0;  // 将这个人标记为出局
                step = 0;  // 重置报数
                remaining--;  // 剩余人数减少
            }
        }
        index = (index + 1) % n;  // 移动到下一个位置
    }
    
    // 找到最后剩下的人
    for (int i = 0; i < n; i++) {
        if (people[i] == 1) {
            delete[] people;  // 释放内存
            return i;  // 返回大王的编号
        }
    }
    
    delete[] people;  // 释放内存
    return -1;  // 这种情况不应该发生
}

int main() {
    int n, k, m;
    cout << "请输入总人数 n: ";
    cin >> n;
    cout << "请输入开始报数的人的编号 k: ";
    cin >> k;
    cout << "请输入报数上限 m: ";
    cin >> m;
    
    int king = findKing(n, k, m);
    cout << "大王的编号是: " << king << endl;
    
    return 0;
}

3.C++动态数组vector

1.仅将C语言静态数组改为使用C++vector
  • 使用vector容器 arr 来表示约瑟夫环。
  • 初始化vector,使每个元素的值等于其索引加1。
  • 使用 index 变量跟踪当前位置,count 变量计数。

使用vector而不是固定大小的数组,可以处理任意大小的n。并且使用了C++的标准库功能,如vector的 erase 方法。但对于非常大的 n,频繁使用 erase 可能会影响性能,因为它需要移动后面的所有元素。

#include <iostream>
#include <vector>
using namespace std;

int findKing(int n, int k, int m) 
{
   vector<int> arr(n);
    for(int i=0;i<n;i++)
    {
        arr[i] = i+1;
    }
    int index = k-1;
    int count = 0;
    while(arr.size()>1)
    {
        count++;
        if(count == m)
        {
            arr.erase(arr.begin()+index);//使用erase代替for循环
            count = 0;
            index--; //修正index以指向正确的下一个元素
            
        }
        index = (index + 1) % arr.size();// 移动到下一个位置
    }
    return arr[0];
}
int main() {
    int n, k, m;
    cin >> n;
    cin >> k;
    cin >> m;
    int king = findKing(n, k, m);
    cout << king << endl;
    return 0;
}
2.新版本
  • 新版本直接在一步中计算出要删除的人的位置:index = (index + m - 1) % people.size(); 这减少了循环中的操作次数,提高了效率。
  • 新版本不需要index这个调整,因为删除后下一个人自动占据了这个位置。
#include <iostream>
#include <vector>
using namespace std;

int findKing(int n, int k, int m) {
    vector<int> people(n);
    for (int i = 0; i < n; i++) {
        people[i] = i+1;
    }
    
    int index = k - 1;  // 因为数组索引从0开始,所以k需要减1
    
    while (people.size() > 1) {
        index = (index + m - 1) % people.size();  // 找到要删除的人的位置
        people.erase(people.begin() + index);  // 将这个人移出队伍
        // 不需要修改index,因为下一个人现在在这个位置上
    }
    
    return people[0];  // 返回最后剩下的人的编号
}

int main() {
    int n, k, m;
    cout << "请输入总人数 n: ";
    cin >> n;
    cout << "请输入开始报数的人的编号 k: ";
    cin >> k;
    cout << "请输入报数上限 m: ";
    cin >> m;
    
    int king = findKing(n, k, m);
    cout << "大王的编号是: " << king << endl;
    
    return 0;
}

3.循环单链表

 1.C版本

  • 使用结构体和函数,采用过程式编程方法。
  • 使用 struct Node 定义链表节点,直接操作节点指针。
  • 使用 malloc() 分配内存,使用 free() 释放内存,需要手动管理内存。
  • 使用 create() 函数一次性创建整个链表,在创建过程中直接构建循环链表。
  • josephus() 函数接受头节点和 k 值作为参数,使用 count 变量累加,达到 k 时重置为 0。
  • 所有功能都在全局作用域中实现,通过直接修改指针直接操作链表,可能在大规模数据时略有性能优势。
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
typedef struct Node
{
    int data;           // 节点数据
    struct Node* next;  // 指向下一个节点的指针
} Node;

// 创建约瑟夫环
Node *create(int n)
{
    // 创建头节点
    Node* head = (Node*)malloc(sizeof(Node));
    head->data = 1;
    head->next = head;  // 循环链表,头节点指向自己

    Node *prev = head;
    // 创建其余的n-1个节点
    for(int i = 2; i <= n; i++)
    {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = i;
        prev->next = newNode;  // 将新节点连接到链表
        prev = newNode;        // 更新prev指针
    }
    prev->next = head;  // 最后一个节点指向头节点,形成循环
    return head;
}

// 执行约瑟夫问题的淘汰过程
int josephus(Node* head, int k)
{
    Node* current = head;
    Node* prev = NULL;
    int count = 0;

    // 当链表中还有多于一个节点时继续循环
    while(current->next != current)
    {
        count++;
        if(count == k)  // 如果数到k,执行淘汰
        {
            prev->next = current->next;  // 从链表中移除当前节点
            free(current);               // 释放被淘汰节点的内存
            current = prev->next;        // 移动到下一个节点
            count = 0;                   // 重置计数器
        }
        else
        {
            prev = current;
            current = current->next;  // 移动到下一个节点
        }    
    }

    int survivor = current->data;  // 记录最后幸存者的编号
    free(current);  // 释放最后一个节点的内存
    head = NULL;    // 将头指针置空
    return survivor;
}

int main()
{
    int n, k;
    int survivor;

    // 获取用户输入
    printf("请输入约瑟夫环的人数n:");
    scanf("%d", &n);
    printf("请输入每次数的数字k:");
    scanf("%d", &k);

    // 创建约瑟夫环并执行问题求解
    Node* head = create(n);
    survivor = josephus(head, k);

    // 输出结果
    printf("最后幸存者的编号是:%d\n", survivor);

    return 0;
}

2.C++版本

  • C++ 版本:使用类和对象,采用面向对象编程方法。 
  • 使用 class Node 定义链表节点,封装了 CircularLinkedList 类来管理链表操作。
  • 使用 new 运算符创建对象,使用 delete 运算符销毁对象,在类的方法中封装了内存管理。
  • 使用 insert() 方法逐个插入节点,在 main() 函数中循环调用 insert() 来构建链表。
  • josephus() 方法是 CircularLinkedList 类的成员函数,使用 for 循环直接数到 k,通过类的内部状态(如 size)来控制循环结束。
  • 主要功能封装在 CircularLinkedList 类中,通过封装提高了代码的可维护性,但可能引入轻微的性能开销。

#include <iostream>

// 定义链表节点类
class Node {
public:
    int data;    // 节点数据
    Node* next;  // 指向下一个节点的指针
    
    // 构造函数
    Node(int value) : data(value), next(nullptr) {}
};

// 定义循环链表类
class CircularLinkedList {
private:
    Node* head;  // 头节点指针
    int size;    // 链表大小

public:
    // 构造函数
    CircularLinkedList() : head(nullptr), size(0) {}

    // 插入新节点
    void insert(int value) {
        Node* newNode = new Node(value);
        if (!head) {
            head = newNode;
            head->next = head;  // 创建循环链表
        } else {
            Node* temp = head;
            while (temp->next != head) {
                temp = temp->next;
            }
            temp->next = newNode;
            newNode->next = head;
        }
        size++;
    }

    // 执行约瑟夫问题
    int josephus(int k) {
        if (!head) return -1;  // 如果链表为空,返回-1
 
        Node* current = head;
        Node* prev = nullptr;
        while (size > 1) {  // 当链表中还有多于一个节点时继续循环
            // 移动k-1步
            for (int i = 1; i < k; i++) {
                prev = current;
                current = current->next;
            }
            // 删除第k个节点
            prev->next = current->next;
            delete current;
            size--;
            current = prev->next;
        }
        // 保存最后幸存者的编号
        int survivor = current->data;
        delete current;  // 删除最后一个节点
        head = nullptr;  // 将头指针置空
        return survivor;
    }
};

int main() {
    int n, k;
    // 获取用户输入
    std::cout << "请输入人数n: ";
    std::cin >> n;
    std::cout << "请输入计数值k: ";
    std::cin >> k;

    CircularLinkedList cll;  // 创建约瑟夫环
    // 初始化约瑟夫环
    for (int i = 1; i <= n; i++) {
        cll.insert(i);
    }

    // 执行约瑟夫问题并获取结果
    int survivor = cll.josephus(k);
    // 输出结果
    std::cout << "幸存者的编号是: " << survivor << std::endl;

    return 0;
}

4.递归算法

#include <iostream>

// 递归函数来解决约瑟夫问题
int josephus(int n, int k) {
    // 基本情况:如果只有一个人,他就是幸存者
    if (n == 1) {
        return 1;
    }
    // 递归步骤:
    // 1. 解决n-1人的子问题
    // 2. 调整结果以适应n人的情况
    return (josephus(n - 1, k) + k - 1) % n + 1;
// 调整公式:(josephus(n - 1, k) + k - 1) % n + 1
//	+ k - 1:因为从上一轮幸存者的位置开始数,需要再数k-1个位置。
//	% n:确保我们在圆圈内循环。
//	+ 1:因为我们的编号从1开始,而不是0。
}

int main() {
    int n, k;
    
    // 获取用户输入
    std::cout << "请输入人数n: ";
    std::cin >> n;
    std::cout << "请输入计数值k: ";
    std::cin >> k;
    
    // 计算并输出结果
    int survivor = josephus(n, k);
    std::cout << "幸存者的编号是: " << survivor << std::endl;
    
    return 0;
}

 5.动态规划

#include <iostream>
#include <vector>

using namespace std;

int josephusDynamic(int n, int k) {
    vector<int> dp(n + 1); 
    dp[1] = 1; // 基本情况:只有一个人时,幸存者位置为1

    for (int i = 2; i <= n; i++) {
        dp[i] = (dp[i - 1] + k - 1) % i + 1;//递推关系
    }

    return dp[n];//dp[i] 表示在有 i 个人的情况下,幸存者的位置
}

int main() {
    int n, k;
    cout << "请输入总人数 n: ";
    cin >> n;
    cout << "请输入报数间隔 k: ";
    cin >> k;
    
    int survivor = josephusDynamic(n, k);
    cout << "最后幸存者的位置是: " << survivor << endl;
    
    return 0;
}

6.本文小结

文章展示了从简单到复杂的不同编程方法,包括数组、链表、递归和动态规划等不同思路,给读者提供了全面的参考,希望能够帮助读者系统性地理解问题,并根据需要选择合适的解决方案。不仅适合初学者理解基本的数组和链表操作,也对进阶读者提供了递归和动态规划的更高级的解法。

不足之处 :

  1. 理论讲解略显不足:文章主要侧重于代码实现,但对每种方法背后的理论讲解较少,可能让一些读者难以深入理解不同算法之间的优劣和适用场景。
  2. 缺少性能分析:尽管介绍了多种解决方法,但没有对这些方法在实际应用中的性能(如时间复杂度和空间复杂度)进行深入分析。对于需要选择最优解的读者来说,这部分内容可能会有所欠缺。
  3. ......
约瑟夫环(Josephus Circle) 约瑟夫环(Josephus Circle)是一个数学的应用问题:已知 n 个人(分别用编号 0, 1, 2, ..., n - 1 表示)围坐在一张圆桌周围。从编号为 0 的人开始报数,数到 m 的那个人出圈,他的下一个人又从 1 开始报数,数到 m 的那个人又出圈,依次规律重复下去,直到剩余最后一个胜利者。 阅读详情

相关推荐

约瑟夫环问题

约瑟夫问题

2302_80873119的博客 1127

约瑟夫环

一、问题描述 有 M 个人,其编号分别为 1-M。这 M 个人按顺序排成一个圈(如图)。现在给定一个 数 N,从第一个人开始依次报数,数到 N 的人出列,然后又从下一个人开始又从 1 开始依次 报数,数到 N 的人又出列...如此循环,直到最后一个人出列为止。 【输入格式】 输入只有一行,包括 2 个整数 M,N。之间用一个空格分开(0 < n <= m <= 100...

雪雪 823

幸存者:约瑟夫环问题

思考这样一个问题:你和另外40个人被一个野蛮的部落包围了,酋长要求你们围成一个圆圈,从第1个位置上的人开始报数,报到3的人将会被杀掉。这个过程沿着圆圈一直继续,直到剩下最后一个人,这个人可以安全地离开。你要选择站在第几个位置才能成为那个幸运的幸存者呢?         这就是有名的约瑟夫环问题。下面我们就来探讨一下几种解决方案。 链表法         不难看出,这个问题非常适合使用循环链表

feber007的专栏 2894

java单链表解决约瑟夫环问题

java单链表解决约瑟夫环问题

qq_59524897的博客 961

图片数据爬取工具Image-Downloader的安装和使用

文章目录1、python安装2、下载chromedriver并配置3、下载phantomjs并配置.4、安装相关python库5、使用 安装包地址:https://github.com/sczhengyabin/Image-Downloader 下载: 方式一:打开cmd,输入: git clone https://github.com/sczhengyabin/Image-Downloader.git 方式二:打开网址 1、python安装 该数据爬取工具要求python>=3.5,由于

wxplol的博客 6673

开源人形机器人硬件生态:关键技术、产业链与低成本突破 | OpenLoong 社区线下分享会

本文将深入探讨人形机器人硬件平台的关键技术、产业链与核心部件以及降低成本的策略。从硬件平台的核心技术,到机器人核心零部件的详细介绍,再到产业链各环节的协同发展以及实现低成本化的创新思路,将一同剖析人形机器人迈向广泛应用所面临的挑战与机遇,展望其未来的发展趋势,为开发者和相关从业者提供一些参考与启示。

OpenLoong_的博客 2419

【C++练习】40. 约瑟夫环问题

本文介绍了约瑟夫环问题的两种主要解法。第一种是使用循环链表模拟整个过程,通过创建循环链表并依次删除第k个节点来实现,该方法直观但效率较低。第二种是数学递归解法,利用递推公式直接计算最后幸存者的位置,效率更高但仅适用于求解最终结果。文章还提供了各方法的C++实现代码,并比较了它们的优缺点。对于特殊情况k=2,还给出了时间复杂度O(1)的优化解法。实现时需注意链表方法的内存管理以及递归可能导致的栈溢出问题。

视睿 2486

(论文速读)低光照图像增强综述(一)

深度学习在弱光图像增强(LLIE)领域取得显著进展,但仍面临泛化性和应用评估不足的挑战。本研究通过统计分析30多种深度学习方法,揭示了监督学习在性能指标上的优势(如DLL的PSNR达25.67dB)与无监督方法(如Zero-DCE++)在实际任务中的潜力。实验发现,增强后的人脸检测mAP最高可提升14.54%,但视觉质量与机器性能存在差异。研究指出当前主要瓶颈包括极端光照处理能力不足、4K+实时处理困难及评估标准不统一,并提出了自适应增强、扩散模型应用等未来方向。

LJ1147517021的博客 2240

约瑟夫环问题,多种方式处理

约瑟夫环问题,这是一个很经典算法 问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号) 先说下当时的思路,当时以为留下的人是有规律的,就想用数学归纳法,找到这个规律,但是下面写了结果,发现并没有什么规律。 n=1 , 留下1 ;n=2 , 留下2 ;n=3 , 留下2 ;n=4 , 留下1 ;n=5 , 留下4 ; n=6 , 留下1 ;n=7 , 留下4 ;n=8 , 留下...

gcs的博客 684

【TCAX相关】Python 官方手册下载页面(中文+英文)

Python 官方手册下载页面(中文+英文) 中文: https://docs.python.org/zh-cn/3.8/archives/ https://docs.python.org/zh-cn/3.6/archives/ 英文: https://www.python.org/doc/versions/ https://docs.python.org/3/archives/ https://www.python.org/ftp/python/doc/ ...

Seekladoom的博客 1012

别再搞错了!ERA5-Land小时数据里的辐射值,原来不是你想的那个‘瞬时值’

本文深入解析ERA5-Land小时数据中辐射值的累积特性,揭示其与瞬时值的本质区别。通过详细的数据处理方法和Python代码示例,指导研究者正确转换累积辐射量为实用瞬时值,避免常见误区,提升气候模型验证的准确性。

weixin_28700411的博客 208

c语言线性队列对约瑟夫环,Java实现约瑟夫环问题

有朋友去浦发面试,因为我们是相同岗位,为了查漏补缺,便问了一下他们的机试题目。机试考3道编程,前两道很水,最后一道他说有点麻烦,没有AC。我自己也尝试着码了一下,然后发现还是得需要耐心。在此,我列出了三种方法,以供大家参考。其中包括标号从0 开始的(0....(N-1)),和标号从1开始的(1....N))两个版本。先简单说一下我的思路,前两种方法就是模拟整个过程:1. 标号从1开始:用动态数组存...

weixin_34168834的博客 185

cadence数模混合仿真反标sdf

数模混合IC设计时经常要调用一些Verilog模块(最简单的例如SPI接口),在前仿时一般直接用rtl代码来仿真,但是后仿时要关注因寄生带来的延迟,避免这些额外的延迟导致时序错误,因此不能简单地采用RTL来仿真。 一般有两种办法:1是采用由RTL综合得到的门级电路来仿真,这种方法比较简单,但是缺点是规模较大,而且只包括门延迟不包括因版图导致的线延迟;如果想要仿真更精细,就要对该这部分门电路提取寄生参数; 另一种方式是利用sdf文件(standard delay format)来进行仿真。后端工具在布局布

长河柱天的博客 7274

约瑟夫环、链表拷贝、数组中数字出现的次数、礼物的最大价值

文章目录约瑟夫环链表拷贝数组中数字出现的次数 约瑟夫环 递归 f(n, m) 表示从n个数中每次删除第m个, 最后剩下的值的下标 (注意m是第m个, f是下标, m-1=f的) f(n, m) = (((f(n-1, m) + 1) + m%n ) - 1) % n = (f(n-1, m) + m) % n; f(n-1, m) + 1 是第几个, 也就是偏移量, f(n-1, m) + 1 + m%n 就是最终答案的偏移量, 求下标时应该-1取模, 最后化简就是(f(n-1, m) + m) %

weixin_40996518的博客 132

OmniDrive(2):环境搭建

项目中使用的是全量的数据集(full dataset v1.0), 数据量比较大,训练验证(trainval) + test 总计200多G的数据,单独一个个下载会比较慢。参数,否则安装的时候会自动卸载已安装好的torch,重新安装最新版本的torch,这是不允许的。在cuDNN官网下载,默认下载的是最新版本的cuDNN,我们这里点击。,== 博文中详细介绍了完整的cuda和cudnn的安装过程==分析: 这是因为yapf 安装的版本不对,需要安装特定的版本。出现训练的loss变化,就说明可以正常训练了。

@bangbang的博客 623

激光雷达点云可视化:Open3D与PCL实战

激光雷达点云可视化:Open3D与PCL实战 ,人工智能,计算机视觉,大模型,AI,该文围绕激光雷达点云可视化,介绍了Open3D与PCL的实战应用。先阐述点云基础概念、特点及可视化意义,接着讲解Open3D的简介、环境配置,以及其在点云读取、显示、颜色设置、下采样和滤波等方面的实战操作,还介绍了PCL的基础、环境配置及相关实战,包括点云读取、显示、颜色设置、下采样和滤波,同时对比了两者的易用性、功能覆盖、性能和适用场景,给出综合实战案例与常见问题解决方法,为点云可视化处理提供了全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

约瑟夫环c语言代码顺序存储,详解约瑟夫环问题及其相关的C语言算法实现

约瑟夫环问题N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。请按退出顺序输出每个退出人的原序号算法思想用数学归纳法递推。无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),若nm非常大,无法在短时间内计算出结果。我们注意到原问题仅仅是要...

weixin_39817176的博客 1012

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

三种方法求解约瑟夫环问题

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 方法1:使用stl::list模拟环形链表,参考剑指offer 代码: #include #include using namespace std; i

byf_study_alway的专栏 2102

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: C++中string与其他STL容器的一些不同点
下一篇: C++职工管理系统
py_cpp_java_c
博客等级 码龄3年 125粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值