C/C++语言基础进阶算法备赛面试 经典、实用、趣味 程序设计编程300例精解每日一练第49天

文章介绍了作者备赛蓝桥杯及电子设计大赛的训练方法,每日进行C语言和算法的练习,包括基础题、趣味题和经典算法题。基础题涉及字符串排序,趣味题举例为解决任务委派问题的逻辑推理,经典算法题讲解奇数魔方阵的填充策略。作者强调了持续训练和利用碎片时间的重要性。
摘要由CSDN通过智能技术生成

前言:

备赛蓝桥杯,大学电子设计大赛,C语言提高,算法准备,定位大厂刷题,所以每天一练,不是很适合新手,适合长期规划有一定基础的同学跟上,每日文档由三部分组成,基础题(适合备赛国二),趣味题(适合有兴趣的同学),经典算法题(适合更高要求)组成。当然本意是记录自己训练的过程,基础题基本能做出来,能给自己一个正面回馈,趣味题可以培养兴趣,经典算法题用于真正来训练自己,开眼见长见识,在遇到困难的问题有更好的解决办法,最关键是每天三个题充分利用了零碎时间,细水才能长流,共勉坚持!!!!

基础题:

题目:字符串排序。

1.程序分析:

2.程序源代码:

main() 

{ 

char *str1[20],*str2[20],*str3[20]; 

char swap(); 

printf("please input three strings\n"); 

scanf("%s",str1); 

scanf("%s",str2); 

scanf("%s",str3); 

if(strcmp(str1,str2)>0) swap(str1,str2); 

if(strcmp(str1,str3)>0) swap(str1,str3); 

if(strcmp(str2,str3)>0) swap(str2,str3); 

printf("after being sorted\n"); 

printf("%s\n%s\n%s\n",str1,str2,str3); 

} 

char swap(p1,p2) 

char *p1,*p2; 

{ 

char *p[20]; 

strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); 

} 

趣味题:

49.委派任务

某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
1)A和B两人中至少去一人;
2)A和D不能一起去;
3)A、E和F三人中要派两人去;
4)B和C都去或都不去;
5)C和D两人中去一个;
6)若D不去,则E也不去。
问应当让哪几个人去?

*问题分析与算法设计

用A、B、C、D、E、F六个变量表示六个人是否去执行任务的状态,变量的值为1,则表示该人去;变量的值为0,则表示该人不参加执行任务,根据题意可写出表达式:
a+b>1 A和B两人中至少去一人;
a+d!=2 A和D不能一起去;
a+e+f2 A、E、F三人中要派两人去;
b+c
0或b+c2 B和C都去或都不去;
c+d
1 C和D两人中去一个;
d+e0或d1 若D不去,则E也不去(都不去;或D去E随便)。
上述各表达式之间的关系为“与”关系。穷举每个人去或不去的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。

*程序说明与注释
#include<stdio.h>
int main()
{
int a,b,c,d,e,f;
for(a=1;a>=0;a–) /*穷举每个人是否去的所有情况*/
for(b=1;b>=0;b–) /*1:去 0:不去*/
for(c=1;c>=0;c–)
for(d=1;d>=0;d–)
for(e=1;e>=0;e–)
for(f=1;f>=0;f–)
if(a+b>=1&&a+d!=2&&a+e+f==2
&&(b+c==0||b+c==2)&&c+d==1
&&(d+e==0||d==1))
{
printf("A will%s be assigned. \n",a?"":"not");
printf("B will%s be assigned. \n",b?"":"not");
printf("C will%s be assigned. \n",c?"":"not");
printf("D will%s be assigned. \n",d?"":"not");
printf("E will%s be assigned. \n",e?"":"not");
printf("F will%s be assigned. \n",f?"":"not");
}
}
*思考题

某参观团按以下条件限制从A、B、C、D、E五个地方中选若干参观点:
1)如去A,则必须去B;
2)D、E两地只能去一地;
3)B、C两地只能去一地;
4)C、D两地都去或都不去;
5)若去E地,A、D也必去。
问该团最多能去哪几个地方?

经典算法题:

49.奇数魔方阵

说明
将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所示:
在这里插入图片描述
解法

填魔术方阵的方法以奇数最为简单,第一个数字放在第一行第一列的正中央,然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:
在这里插入图片描述
在这里插入图片描述
一般程式语言的阵列索引多由0开始,为了计算方便,我们利用索引1到n的部份,而在计算是向右(左)上或向下时,我们可以将索引值除以n值,如果得到余数为1就向下,否则就往右(左)上,原理很简单,看看是不是已经在同一列上绕一圈就对了。

#include <stdio.h> 
#include <stdlib.h> 

#define N 5 

int main(void) { 
    int i, j, key; 
    int square[N+1][N+1] = {0}; 

    i = 0; 
    j = (N+1) / 2; 

    for(key = 1; key <= N*N; key++) { 
        if((key % N) == 1) 
            i++; 
        else { 
            i--; 
            j++; 
        } 

        if(i == 0) 
            i = N; 
        if(j > N) 
            j = 1; 

        square[i][j] = key; 
    } 

    for(i = 1; i <= N; i++) { 
        for(j = 1; j <= N; j++) 
            printf("%2d ", square[i][j]); 
    } 

    return 0; 
} 

后续

有更优秀的解法和更优秀的训练题评论区留言,多交流!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄黄在深夜里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值