环形处理习题,举例:约瑟夫环,魔方阵

目录

约瑟夫环

魔方阵


约瑟夫环

题目描述:有n 个人围成一圈,顺序排号。从第1个人开始报数从1到3报数凡是报到3 的人退出圈子,问最后留下的是原来的第几号?

环形处理:依次遍历数据集的每个元素(每个人依次报号),直到遍历到最后一个元素时,便开始对数据集进行新一轮的遍历(最后一个人报完号后,再次轮到第一个人报号)。

处理方法1:i=(i+1)%n

cpp 复制代码
int joseph(int n)
{
	int* arr = (int*)malloc(n * sizeof(int));//标志数组
	assert(arr != NULL);
	if (arr == NULL)
		return -1;//出错
	int i;
	for (i = 0; i < n; i++) {
		arr[i] = 1;//1还在游戏,0退出游戏
	}
	int count = n;//还在参与游戏的人数
	int tmp = 0;//报数器
	i = 0;
	while (count > 1) {
		if (arr[i] == 1)//报数
		{
			tmp++;
			if (tmp == 3)//退出
			{
				arr[i] = 0;
				count--;
				tmp = 0;
			}
		}
		//i++//线性,错误,必须环形处理
		i = (i + 1) % n;//环形
	}
	//找还在参与的人数
	for (i = 0; i < n; i++) {
		if (arr[i] == 1)
			break;
	}
	free(arr);
	return i + 1;
}

处理方法2:

  • if-else语句判断
  • 三目运算符i = (i == n - 1) ? 0 : i + 1;
cpp 复制代码
int joseph(int n)
{
	int* arr = (int*)malloc(n * sizeof(int));//标志数组
	assert(arr != NULL);
	if (arr == NULL)
		return -1;//出错
	int i;
	for (i = 0; i < n; i++) {
		arr[i] = 1;//1还在游戏,0退出游戏
	}
	int count = n;//还在参与游戏的人数
	int tmp = 0;//报数器
	i = 0;
	while (count > 1) {
		if (arr[i] == 1)//报数
		{
			tmp++;
			if (tmp == 3)//退出
			{
				arr[i] = 0;
				count--;
				tmp = 0;
			}
		}
		//if (i == n - 1)
		//	i = 0;
		//else
		//	++i;

		i = (i == n - 1) ? 0 : i + 1;
	}
	//找还在参与的人数
	for (i = 0; i < n; i++) {
		if (arr[i] == 1)
			break;
	}
	free(arr);
	return i + 1;
}

魔方阵

输出奇数阶"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。

例如,三阶魔方阵为:

奇数魔方阵的特点:

1.数字1放在第一行中间;

2下一个值放在前一个值的"上一行,后一列"(例如数字2,数字3);

3如果下一个位置已经有数据了,则放在前一个值的"下一行,同列"(例如数字4).

cpp 复制代码
int** Cube(int n)
{
    if (n % 2 != 1)
        return NULL;
    int** p = (int**)malloc(n * sizeof(int*));
    assert(p != NULL);
    for (int i = 0; i < n; i++)
    {
        p[i] = (int*)calloc(n,sizeof(int));
        assert(p[i] != NULL);
    }
    int i = 0;
    int j = n / 2;
    p[i][j] = 1;
    int tmp = 2;
    while (tmp <=n*n)
    {
        if (p[(i + n - 1) % n][(j + 1) % n] == 0)
        {
            p[(i + n - 1) % n][(j + 1) % n] = tmp;
            i = (i + n - 1) % n;
            j = (j + 1) % n;
        }
        else
        {
            p[(i + 1) % n][j] = tmp;
            i = (i + 1) % n;
        }
        tmp++;
    }
    return p;
}

int main() {
    int** arr = Cube(3);
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

总结:

环形处理向后移动:i=(i+1)%n

环形处理向前移动:i=(i-1+n)%n

相关推荐
inrichtt41 分钟前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger1 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训1 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen2 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy2 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据2 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
erzong2314 小时前
Linux操作系统:线程概念与控制
linux·算法
wuminyu4 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
Nil2084 小时前
leetcode 5最长回文子串
算法·leetcode·职场和发展
xxwl5854 小时前
区域赛分类题解
c++·笔记·学习·算法