斑马日记2025.10.6

今天解决了昨天的一道关于矩阵的编程题,跟随视频课学习了程序运行的四大区:代码区、全局区、栈区、堆区的内容。

学到的新知识:

代码区:编译器把写出来的高级编程语言(C++)转化成机器语言(二进制指令),然后传到代码区供CPU读取指令,就可以执行程序了,还有多个进程可能共享同一份代码区(就好比做把中文菜谱(高级编程语言)转化成英文菜谱(机器语言),然后放在菜板(代码区)上供厨师(CPU)去参考做菜。还有多个菜谱都可以放在一个菜板上)

全局区:用来存储需要长期使用,不会随便消失的数据的内存区域,存储 全局变量、全局常量、静态变量、字符串常量 里面很干净,即使不初始化,变量的初值也是0;

栈区和堆区的内存都是程序运行中申请和释放的,区别在于栈区是操作系统控制生命周期,而堆区是程序员来控制,也就是手动申请,手动释放内存

栈区:专门存放临时数据的内存区域,用完就扔,很像存备胎的微信分组,过一段时间就都 拉黑了,存储局部常量和局部变量,里面会充斥很多垃圾值,所以如果不初始化,就会被赋予一个垃圾值;

堆区:动态申请的内存存放的数值才会存放在堆区,C++动态申请内存的运算符是new和delete;

今天大概就这些浅层次的理解了,欢迎大家补充和指导。

接下来分享一下今天做的编程题

/*
https://www.lanqiao.cn/problems/3961/learning/?page=1&first_category_id=1&name=阿坤老师
阿坤老师是学校的数学老师,他特别喜欢让学生挑战一些有趣的数学问题。
今天,他给学生带来了一个巨大的魔方。这个魔方的每个面都是一个
N×N 的方阵,每个小格子上都填有一个整数。
阿坤老师允许学生按行或者按列,将魔方的一个面上的所有行或者所有列,循环移动若干个位置。
他希望学生通过移动行或列,使得主对角线(左上角到右下角)上的数字之和最大。
请问,应该如何移动,才能得到最大的主对角线数字之和?*/

include

using namespace std;
int main(){
int n,i,j,hang,lie,sum;
int Max = 0;
cin>>n;
int a[n][n];
for( i=0;i<n;i++){
for( j=0;j<n;j++){
cin>>a[i][j];
}
}
for(i=0;i<n;i++){
lie = i;
sum = 0;
for(hang=0;hang<n;hang++,lie++){
if(lie==n){
lie = 0;
}
sum+=a[hang][lie];
}
if(Max<sum){
Max = sum;
}
}
cout<<Max<<endl;
return 0;

}
AI运行代码
cpp

其实我也是借鉴的评论区一位哥们的想法,但一开始理解起来对我有些费劲,所以我把我认为需要额外理解和注意的地方完善一下,欢迎大家纠错: 我的思路就是移动对角线来找最大值,而且n=3时只需要比较三组数据就可以,这是为什么呢首先,根据题目,可以按照行或者按照列循环移动,所以要么移动行要么移动列,不能先移动行再移动列,反之亦然; 其次,根据一些例子我发现,不管是循环移动行还是循环移动列,最终的对角线的组合是一样的,比如题目给的样例:通过列移动,可以得到三组对角线的组合: 7+5+3、8+7+1、9+4+2,而通过行移动呢,也是三个组合:7+5+3、4+2+9、1+8+7,你会发现,这六组数据是两两重合的,所以只需要按照行或者列移动一次就好了; 最后,代码实现方面,其实挺顺的,输入n,循环输入矩阵的值,然后通过循环来计算对角线上的值,精妙之处就在于,不需要真的去改变矩阵来移动对角线,只需要改变存入sum的值就可以了。

需要改进和学习的地方:

1.遇到问题以后限时思考,直接去看答案的思路或者其他人的题解,借鉴他们的思路,自己的思路可能不好实现;

2.一定要注意审题。
————————————————
版权声明:本文为CSDN博主「FMRbpm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FMRbpm/article/details/152618263

posted @ 2025-10-14 15:08  跟我读bpm  阅读(3)  评论(0)    收藏  举报