- 博客(28)
- 收藏
- 关注
原创 广度优先搜索(之马遍历)C语言
拿出这个节点来计算上下左右四个节点,记录下来,将搜索到的节点分别加入到这个队列里边,(如果有距离计算,此时也要计算了)此时节点11已经是处理过的节点了,就要将它从队列中拿出来(也就是双指针中队头指针移动,是处理队列中不包含这个节点)。所以要表示新位置,就是当前的位置坐标加上要走的方向坐标,然后求得的结果就是新到达的位置。再以四周节点的其中一个,7为下一个要搜索的节点,再去搜索7的四周的方向,即3,6,8,11,这个节点处理完之后,再处理下一个开始的节点,即10,之后再是12,15,3,6,8。
2026-01-27 16:56:37
154
原创 C语言之切蛋糕(运用前缀和算法和单调队列算法)
q[]数组的值是sum[]数组的下标,通过q[]数组进行窗口滑动,来保证sum[i]-sum[j]是不超过m块的,且是这几块的和。先计算作差再进行单调性维护,因为经过一次次循环,已经放到队列中的元素sum[]的值肯定是最小的,也就是最优的,所以先计算才可能是得到历史最大sum,而如果先维护再进行作差,可能将历史最小sum全部删除,最后只留下新添加的元素,这肯定是不对的。进行第二次循环时,把i=2加入到q[]数组中,队列变[0,1,2],sum[2]-sum[0]刚好是第二个元素和第三个元素的和。
2026-01-25 22:57:52
621
原创 前缀和算法和单调队列算法(经典例题)
hh=1, tt=0//tt表示的是插入元素后的队列元素的下标,而该队列由op[]数组表示,op[]数组的值,即为a数组的下标。操作:删除队尾 3(≥1)//当要插入数组a的第二个元素的时候,一开始的时候还没有将1插入,a[2]=1只是当前要插入的元素,,用当前要插入的元素与已经插入的元素进行比较,发现第一个元素3大于1,不符合单调递减的条件,所以要将3删除,tt--,所以tt变成了0,正好进行下面的操作op[++tt],把刚刚要插入的元素插入到队列中,变成队列中的第一个元素;上述代码保证队列的完全清空。
2026-01-24 22:13:30
594
原创 C语言之5位黑洞数
一开始的时候,还没有填充all_cycles数组内容,所以不会先执行上述的for循环,而是执行下面的if条件,都满足条件,把int all_cycles[0][1];数组的第一行填充完毕,填的是第一个有循环圈的五位数的循环圈,没有比较,所以一定没有重复,所以直接添加到列表中。先找是否有相同的循环圈,然后再添加到列表中,是因为cycle表示的是当前发现的循环圈数组,而all_cycles[i]表示的是已存储的第i个循环圈,二者比较,看看是否重复,决定当前的循环圈是否列入all_cycles[i]。
2026-01-17 00:20:31
585
原创 C语言之串的简单处理
但是在找到下一个首字母的时候,要将其再转换成0.同时,要将该字符即下一个字符的前一个字符prev_is_space=0.(是字符,不是空格)因为一开始的字符肯定是该行字符的首字母,所以就要将其赋值给输出数组的第一个output[j],一开始定义j=0.之后不满足首字母的条件了,就要执行下面的else语句了。而且还有点小错误……同时,读取下一个字符的时候,当前字符为下一个字符的前一个字符,非常明确。只有整个单词结束后的第一个空格才是我们要找的空格,是赋给输出数组的空格,所以前一个必须是字符,不可能是空格,
2026-01-14 23:48:08
471
原创 C语言之猜算式
上述代码中的if条件语句判断,因为右边两个数字中右边的那个已经是三位数确定了,所以右边两个数字不可能发生交换,所以只需要判断左边两个数是否交换顺序,因为for循环的外层循环是第一个数字,内层循环是第二个数字,所以可能出现两个交换顺序的情况,此时就要利用该代码来判断是否重复,最终只需要输出一个即可。之后就符合上述for循环了,用于判断当前找到的等式是否与之前输出的等式重复,如果重复,那就duplicate = 1;但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。如果没有限定条件,这样的例子很多。
2026-01-12 22:23:21
50
原创 C语言之泊松分酒(油量倒换)
最后找到目标状态返回的只是路径长度,而这个路径长度回溯回去就是result的值,那result的值肯定不是-1,所以会执行每一部分里面的if语句,返回result的值,有正确值肯定不是-1,所以会执行主函数中的for循环,是正序的,关键就在这里。如果没有路径数组,则会输出所有状态,无论是正确路径还是错误路径上的状态,这就不符合题意了,而路径数组有覆盖功能,所以会把错误路径上的状态覆盖,只输出正确路径上的状态。而按字符的形式输入,如果在输完之后,即使有空格,只要不符合上述if语句的条件,则不会影响什么。
2026-01-11 22:56:44
487
原创 C语言之砝码称重
但上述题意明确表示,砝码可以放在左右两个盘中,所以允许负系数,所以cᵢ ∈ {-1,0, 1},cᵢ表示的就是某个砝码重量的个数和放的位置。如果只有 5个砝码,重量分别是 1,3,9,27,81。· 最终:(-1)×3 + (-1)×1 = -3-1 = -4(不对)· 正确:5 = 9 - 3 - 1(即三进制:1(-1)(-1))· 十位:1+1=2 → 又变成2,再变-1,向更高位进1。· 如果某位是2,则将其变为-1,并向高位进1。· 处理个位:2 → -1,向十位进1。· 1:砝码放左盘(加法)
2026-01-11 16:40:43
165
原创 OJ1009:University
上述三个中的一个情况,就会结束输入。字符: 'I' 'l' 't' 't' 'a' 'b' 'a' 'j' 'e' ' ' 'z' 'a' 'u' 'j' 'l' 'i' 'g' '\n' '\0'3. strlen(line) 返回 5('t','e','s','t','\n')//返回字符串的长度不包括字符串结束符,但包括换行符。字符: 'H' 'e' 'l' 'l' 'o' ' ' 'W' 'o' 'r' 'l' 'd' '\0'。字符: 'H' 'e' 'l' 'l' 'o' '\n' '\0'。
2026-01-08 16:44:08
489
原创 C语言之目标柏林
由上述示例得:需要处理的下标是3,6,9,但是在C语言中,需要处理的下标是2,5,8;即为i*k-1,k即为第几个字符,即k为1,2,3;//将第一个字符覆盖第二个字符,将第二个字符覆盖第三个字符,依次覆盖,最后完成移动。因为第一个字符已经被储存在temp中,所以将第二个字符覆盖第一个字符,第三个字符覆盖第二个字符,依次这样覆盖,直到循环结束,最后再把第一个字符覆盖最后一个字符,实现逆时针旋转。上述代码的意思是,上述将后面四个字符依次向左移动位置,移动四次,最后再将第一个字符移到最后字符的位置。
2026-01-07 21:35:54
966
原创 OJ1004:相当于鸡兔同笼问题
为了能让自己的好朋友吃的饱饱的,Redraiment 决定统计一下有多少只鸽子和有多少只兔子,以便带来足够的食物。一、二、三、四、五……每只兔子比鸡多两条腿,所以兔子数为(m-2n)/2.那么鸡的数量是n-兔子数,所以只需要检查m-2n是否为偶数且非负,以及鸡兔数量是否为非负整数即可。童心未泯的 Redraiment 就经常带些碎面包什么的去广场喂鸽子和兔子,并和它们玩耍,一点也不像大学生,还是一副老不正经的样子,呵呵。结束的总是内部循环,所以要实现错误输入的判断,总是要给外部循环一个break。
2026-01-06 18:59:58
752
原创 C语言之 Redraiment 的遭遇
是政府的眼中钉肉中刺,但又没办法,这里头住的可都是纳税大户呀。但迫于压力,限电制度规则不会太抠门,政府决定从 7 月 1 日停电,然后隔一天到 7 月 3 日再停电,再隔两天到 7 月 6 日停电,一次下去,每次都比上一次晚一天。1.用数组来解决问题,数组下标表示天数,数组值的大小表示停电天数,而刚好每次停电一天,停电那一天数组值的大小为1,可以作为标志变量,只要是那一天停电就在停电天数上加1,这样可以得出Redraiment经历了多少天停电。=EOF来表示,因为这只是多组输入,没有体现以输入0/0结束。
2026-01-05 19:01:53
223
原创 OJ类似于部分背包问题——HomeWork
而和上述题目要求每组测试数据以两个整数 M,N开头,接下来有 M 行,每行包括两个整数 T,V,输入以0 0 结束。1.while(1)循环用于多组测试数据的输入,这种题目要求的是每组测试数据以两个整数 M,N开头,接下来有 M 行,每行包括两个整数 T,V,输入以0 0 结束(注意不太像常规的那种多组测试数据输入)既然我以为是c[i].v和c[i].t出现0 0情况,所以我直接没看下面的m行是都有值的m行,以为是第m行出现0 0 ,所以我定义了count来看有多少个有效输入,实际上,这肯定不对。
2026-01-05 17:17:55
316
原创 C语言之将某字符串插入到另一字符串的指定位置
题目描述:将字符串t插入到字符串s中,在位置pos后插入。不得使用字符串操作函数,输出组合成的字符串输入:两个字符串(t和s)和要插入的位置(pos)输出:组合后的字符串上述代码的关键就是明确位置,通过数组赋值。我一开始的思路是想通过往后移n位置往后的内容到后面,然后将另一个字符串插入到空出来的位置,但这需要利用字符串函数,所以无法解决。
2026-01-04 14:42:27
152
原创 C语言之鹊桥相会
当然,牛郎急着去见织女,所以在途中,如果有速度更快的喜鹊赶上了他,他就会换乘那只速度更快的喜鹊。因为牛郎一开始在0位置,假设他要乘坐一只初始位置为0的喜鹊,这样可以不用考虑离他位置远的喜鹊飞过来,他需要等的时间,那乘坐位置为0但速度慢的喜鹊,一定会被一开始离他远但速度快的喜鹊追上,这时候就要换乘,此时离得近但慢的喜鹊和离得远但快的喜鹊运动的时间是一样的,换乘之后,速度就是离得远但快的喜鹊走到对岸需要的时间,所以这样看来,直接等价成离得远但速度最快的喜鹊从原位置到对岸所有的时间即可,即是最短耗时。
2026-01-03 23:53:48
766
原创 贪吃蛇小游戏
main.o+game.o->可执行程序,所以在这一步链接器发现:同一个符号(struct SNAKE)被定义了两次,这是错误的,所以在做文件包含的项目时,不要忘记该结构。光标位置有阻塞等待,即正常输入一个字符,它会在那里闪,等待你输入下一个字符,而贪吃蛇游戏,我们不能让用户输入一个方向蛇走一下,而应该让蛇一直走,所以应该把阻塞等待删掉。蛇的移动控制分析://接收用户的按键操作,进行移动控制//四种按键影响的都是蛇头,所以下述按键引起的位置变化都影响蛇头的位置,所以加在蛇头上。
2026-01-02 23:52:18
481
原创 C语言之部分背包问题
藏宝洞里面有 N(N≤100) 堆金币,第 i 堆金币的总重量和总价值分别是 mi,vi(1≤mi,vi≤100)。阿里巴巴有一个承重量为 T(T≤1000) 的背包,但并不一定有办法将全部的金币都装进去。piles[0] = {weight: 20, value: 100, ratio: 5.0} // 被覆盖。piles[1] = {weight: 10, value: 60, ratio: 6.0} // 被覆盖。步骤2:piles[0] = piles[1];第一行两个整数 N,T。
2025-12-19 20:10:28
221
原创 C语言之田忌赛马(包括两道思路一样,但问题不一样的题目)
你的马匹的速度分别为 u1,u2,⋯,un,田忌的马匹的速度分别为 v1,v2,⋯,vn。接下来一行 N 个用空格隔开的整数,依次为 v1,v2,⋯,vn,表示田忌的马匹们的速度。接下来一行 N 个用空格隔开的整数,依次为 u1,u2,⋯,un,表示你的马匹们的速度。第 1 轮,田忌派出速度为 2 的马匹,你可以派出速度为 3 的马匹迎战,本轮你获胜。第 2 轮,田忌派出速度为 4 的马匹,你可以派出速度为 5 的马匹迎战,本轮你获胜。不成立,停止 → i = 2。
2025-12-19 11:40:20
791
原创 C语言之小果的键盘
因为修改一个字符影响的是和前一个字符配对,和后一个字符配对,所以只需要考虑这两部分即可。(i-1,i)和(i,i+1)这两部分。当考虑到这两部分之后,就要考虑i-1必须要大于0,i+1必须要小于0.又没有好好看题目意思,题目要求的是最多改变一个字符,要求出现最多的vk,一开始没有考虑直接写,分可低了。下面的代码没有考虑左右字符的影响,没有考虑边界情况,所以肯定不对。一.上述代码是模拟修改,不是真的修改,所以不满足条件的不用再修改回来。一天,她打出了一个只有这两个字符的字符串。小果有一个只有两个键的键盘。
2025-12-18 16:39:26
317
原创 C语言之约瑟夫
肯定要定义一个变量表示被处决者,又因为有双循环,前一个,后一个,当前者,索性把被处决者定义为当前者,当前者初始化为计数的位置,而这刚好便于去除当前者后的计数位置为下一个人,同时更好找到处决者时好改变前者后者的位置。所以当m-1<L时,走的步数就是m-1,当人数为L时,走L步会回到起点,当m-1大于L时,走的步数即为余数。方法即为把被处决的位置变成被处决的后一个人,但后一个人的编号不变,只是位置改变。当m=1时,总是处决当前位置,即p=1时被处决,下次计数从第二个人开始,计数1,仍被处决,即当前位置被处决。
2025-12-17 22:19:23
458
原创 C语言之约瑟夫问题
即把i的条件变成i=(i+1)%m,能写出上述公式是因为要在i=m-2之前仍然是i++的效果,即余数为除数。但当i=m-1时,即最后一个人数完后,重新回到第1个人继续循环,即i变成0。但运行之后会发现,会无限循环,因为i的范围总是满足循环条件。所以要修改循环条件,最后剩余不足一个人时,即是循环结束的点。约瑟夫环是实现对m个人的循环计数,即数完第m个人后,重新回到第一个人继续计数,从而模拟m个人围成一圈的效果。首先,编写一个程序,对m个人进行一次计数,即排成一行。同时,不要忘了把已经出列的人去掉。
2025-12-16 22:34:32
204
原创 C语言之最大公约数和最小公倍数问题
输入两个正整数 x0,y0,求出满足下列条件的 P,Q 的个数:P,Q 是正整数。要求 P,Q 以 x0 为最大公约数,以 y0 为最小公倍数。试求:满足条件的所有可能的 P,Q 的个数。
2025-12-16 16:44:19
525
原创 C语言之指针专题
数组a的地址即数组的首地址&a[0]。数组的指针是指数组的首地址,也就是a或者&a[0]。因为a是数组的指针,所以a+i表示首地址后面的第i+1个元素的地址,即为a[i]的地址,即&a[i]。(定义了指向int类型的指针变量pi)int是类型说明符,表示该指针所指向的变量的数据类型;2.如果指针指向的变量是浮点数,所以该指针叫做浮点型指针(但存的地址是整型)而这个浮点型即为指针的基类型。3.指针变量所占的空间都是四个字节,因为指针变量存放的是整数型地址,整数型占四个字节不变。存放地址值的变量叫指针变量。
2025-12-14 19:46:03
371
原创 C语言之打印回型嵌套
里面的倒数第二行,刚好是第一行和最后一行往下和往上数二行,刚好是第一行加2,最后一行减2;同时也是最右侧减2,最左侧加2,但列无法进行减和加,但由上述有行数加减,或许可以解决这个问题。那就以奇数行和偶数行区分开遍历,但有空格,且空格规律不明显,所以肯定不能按照行规律进行遍历解决。那就看题目给的规律,题目说它是由一系列正方形的星号方框嵌套而成,而且又是回型嵌套,所以可以按照回字型来打印。本题的任务就是从标准输入获得一个整数 n(1<n<100),程序则生成嵌套着的回字型星号方框,其最外层方框的边长为 n。
2025-12-07 13:18:52
149
原创 C语言之二维数组-矩阵转置
3.赋值的时候,按输出1 4,即a[0][0]=1,a[1][0]=4,换行后a[0][1]=2,a[1][1]=5,所以最终刚好是a[][]第一个中括号是不断变化的,第二个中括号不变,第一个中括号只有0 1,第二个中括号有0 1 2,所以第一个括号对应j,第二个括号对应i,刚好对应N=3,M=2,每输出一行,输出换行符。之后应该将a[0][0]赋值给b[0][0],a[1][0]赋值给b[0][1],所以得到b数组就按b[i][j]输出刚好三行。上述关键是如何正确将a数组的1 4正确赋值给b数组。
2025-12-03 21:20:03
217
原创 C语言之输入一个数插入到有序数组中
上述代码的基本思想:默认插入在最后面(即n插入的数比所有的数都大)遍历所有数,只要有比插入的数大的数,就把插入的数的下标换成比它大的数的下标,而比它小的数肯定就在插入的数的左边,最终插入的数肯定左边是小的数,右边是大的数,正确排好。因为虽然插入元素被放在最后面,但是程序是从第一个元素开始遍历的,所以只要找到一个比它大的数,它就刚好插在小于它的和大于它的数之间。之后,把找的的位置后面的数字往后移动一位,移动完成后把它插入。这样总是假设插入的元素在两个数之间,没有考虑到边界情况,测试运行指定不对。
2025-12-02 13:05:08
196
原创 C语言之选择排序法
然后与此时的i后面的数字进行比较,所以j=i+1,即i=1时的数字25比p当前所在的位置的数字小,所以p记录当前最小值的位置p=1,再遍历下一个12<25,p=2,之后22>12,p的位置不变,直到遍历到最后一个,p=4,此时对应的最小值应当将它放到未排序元素的最前面,即65和11交换。外层循环指的是进行的轮数,是未排序区域的第一个元素,和后面进行遍历;选择排序:基本思想:在每一轮排序中,从未排序区域找出最小元素,将它放到未排序元素的最前面,不断重复这个过程,最终整个数组就会变成有序的。
2025-12-02 11:46:01
323
原创 C语言之用筛选法求素数
筛选法指的是先筛选出可以被二整除的数,肯定不会是 素数,把所有被2整除的数都划掉;这样才会a[2]=2,a[3]=3,a[4]=0,a[5]=5,就只会使某些值变成0。不能用if(a[i]==1){printf("%d",a[i])} 因为这会改变数字的值,会使所有的数字又变成1,所以无论是初始化a[i]=0还是a[i]=1,都只能定义一个。如果j=2,则最后的结果会输出所有的1-100以内的数字,不会筛选出素数。首先,1一定不是素数,而且可以整除任何数,所以不能用1去除以任何数。
2025-12-01 22:17:33
106
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅