3.14学习总结

做了几道算法题

水题,使用深搜轻易求解

复制代码
#include <stdio.h>
#include <stdlib.h>
int n,num=0;
int a[15],b[10086][15];
//深搜
int hly(int s,int i)
{
    if(i==11){
        if(s==n)
        {
            //将每种配料所放的质量储存到数组b中
            for(int i=1;i<=10;i++){
                b[num][i]=a[i];
            }
        num++;
        }
        return;
    }
        for(int j=1;j<=3;j++){
                a[i]+=j;
                hly(s+j,i+1);
                a[i]-=j;
        }
    return;
}
int main()
{

    scanf("%d",&n);
    //由题可知,烤鸡的美味程度只能在10到30之间
    if(n>=10&&n<=30)
    hly(0,1);
    //输出方案总数
    printf("%d\n",num);
    //输出每种配料所放的质量
    for(int i=0;i<num;i++){
        for(int j=1;j<=10;j++){
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}
复制代码
#include <stdio.h>
#include <stdlib.h>
int a,b,c;
int A,B,C;
int flog=0;
int book[10],d[10];
//将九个数字任意排序,s表示确定第s位数,深搜
int hly(int s)
{
    if(s==10)
    {
        //每三个数为一组,用ABC表示
        A=d[1]*100+d[2]*10+d[3];
        B=d[4]*100+d[5]*10+d[6];
        C=d[7]*100+d[8]*10+d[9];
        //检测是否满足条件
        if(A*b==B*a&&A*c==C*a)
        {
            printf("%d %d %d\n",A,B,C);
            flog=1;
        }
    }
    for(int i=1;i<=9;i++)
    {
        //若i没有被使用
        if(book[i]==0)
        {
            d[s]+=i;
            book[i]=1;
            hly(s+1);
            d[s]-=i;
            book[i]=0;
        }
    }
}
int main()
{
    scanf("%d %d %d",&a,&b,&c);
    hly(1);
    if(flog==0)
        printf("No!!!\n");
    return 0;
}

这道题跟全排列类似,但是又有一点不同,选出了这r个数后,不分每个数的排列顺序,所以不能直接使用全排列的思想,还有场宽这个词之前没听过,刚开始以为直接在数前面加两个空格,然后挂了,后面才发现不是这样,场宽是指数据项的宽度,可以用printf("%kd",n);来输出场宽为k的数字n。

复制代码
#include <stdio.h>
#include <stdlib.h>
int n,m;
int a[25];
//用深搜确定第s个数字
int hly(int s)
{
    //全部选择完了
    if(s==m+1)
    {
        for(int i=1;i<=m;i++)
        {
            //场宽为3
            printf("%3d",a[i]);
        }
        printf("\n");
        return;
    }
    for(int i=a[s-1]+1;i<=n;i++)
    {
        //从小到大寻找第s个数的值
            a[s]=i;
        //寻找第s+1个数;
            hly(s+1);
    }
    return;
}
int main()
{
    scanf("%d %d",&n,&m);
    hly(1);
    return 0;
}

水题,挺简单的,刚开始一直做不出来,以为是算法问题,后面才发现我int了一个字符串数组......,粗心大意,以后得注意细节

复制代码
#include <stdio.h>
#include <stdlib.h>
char a[55][55];
int main()
{
    int n,m,i,j,x,y,min=2e9,num;
    scanf("%d %d\n",&n,&m);
    for(i=1;i<=n;i++){
        scanf(" %s",a[i]);
    }
    //对每种颜色的行数进行枚举
    for(i=1;i<=n-2;i++){
        for(j=1;j<=n-i-1;j++){
                //每次循环将涂格子数清零
                num=0;
                //涂白色格子
                for(x=1;x<=i;x++){
                    for(y=0;y<m;y++){
                        if(a[x][y]!='W')
                            num++;
                    }
                }
                //涂蓝色格子
                for(x=i+1;x<=i+j;x++){
                    for(y=0;y<m;y++){
                        if(a[x][y]!='B')
                            num++;
                    }
                }
                //涂红色格子
                for(x=i+j+1;x<=n;x++){
                    for(y=0;y<m;y++){
                        if(a[x][y]!='R')
                            num++;
                    }
                }
                //寻找最小的涂格子数
                if(min>num)
                    min=num;
        }
    }
    printf("%d",min);
    return 0;
}

寻找第一个成员站的位置,看能不能站下站完k名成员,特殊情况,k小于0时,站法零种,k=1时重复计算了,方法数要除以2。

复制代码
#include <stdio.h>
#include <stdlib.h>
char a[205][205];
int main()
{
    int n,m,l,s=0,flag;
    scanf("%d %d %d",&n,&m,&l);
    //初始化地图
    for(int i=1;i<=n;i++)
        scanf(" %s",a[i]);
    //特例,没有队员,站不了
    if(l<=0)
    {
        printf("0\n");
        return;
    }
    //寻找第一位队员站的位置
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            if(a[i][j]=='.'){
                flag=0;
                //往右寻找能不能站完
                for(int k=0;k<=l-1;k++){
                    if(a[i][j+k]!='.')
                        flag=1;
                }
                if(flag==0)
                    s++;
                flag=0;
                //向下寻找能不能站完
                for(int k=0;k<=l-1;k++){
                    if(a[i+k][j]!='.')
                        flag=1;
                }
                if(flag==0)
                    s++;
            }
        }
    }
    //特列,重复计算了,方法除以2;
    if(l==1)
        s/=2;
    printf("%d\n",s);
    return 0;
}

啊哈算法中讲枚举时所用的例题

复制代码
#include <stdio.h>
#include <stdlib.h>
//确实每个数用的火柴棍数量
int a[10]={6,2,5,5,4,5,6,3,7,6};
int hly(int x)
{
    int s=0;
    //根据x位数不同,确定x所用的火柴棍数量
    while(x>9){
        s+=a[x%10];
        x/=10;
    }
    s+=a[x];
    return s;
}
int main()
{
    int n,num=0;
    scanf("%d",&n);
    //枚举A与B的值
    for(int i=0;i<=1111;i++){
        for(int j=0;j<=1111;j++){
            int k=i+j;
        //判断是否满足条件
            if(hly(i)+hly(j)+hly(k)==n-4){
                num++;
            }
        }
    }
    printf("%d\n",num);
    return 0;
}
相关推荐
刘阿去14 分钟前
lua C语言api学习2 在C语言中使用lua语言
c语言·学习·lua
niandb44 分钟前
The Rust Programming Language 学习 (五)
网络·学习·rust
迷茫、Peanut2 小时前
嵌入式学习L6网络编程D3TCP
服务器·网络·嵌入式硬件·学习·tcp/ip
Victoria Zhu3 小时前
零基础小白如何系统学习Spring Boot
spring boot·后端·学习
ThisIsClark3 小时前
【gopher的java学习笔记】如何知道一个jar包对应的maven中的groupId和atrifactId
java·笔记·学习
MrZWCui3 小时前
iOS OC使用正则表达式去除特殊符号并加粗文本,适用于接入AI大模型的流模式数据的文字处理
学习·ios·正则表达式·objective-c·xcode
viperrrrrrrrrr74 小时前
大数据学习(67)- Flume、Sqoop、Kafka、DataX对比
大数据·学习·kafka·sqoop·flume·datax
月临水6 小时前
SpringCloud 学习笔记1(Spring概述、工程搭建、注册中心、负载均衡、 SpringCloud LoadBalancer)
学习·spring·spring cloud