2021-07-13

本文记录了作者在2021年7月13日的学习情况,主要涉及三道编程题目。第一题使用暴力递归解决寻找特定形式的数字问题;第二题采用递归策略解决棋盘上摆放棋子的方案数;第三题通过层次遍历计算从地球到牛牛星的最短时间。作者反思了自己的编程习惯,期望持续提升。
摘要由CSDN通过智能技术生成

## 学习总结2021-7-13
## 8:30 打开打卡签到。
## 9:30-13:00 刷vj二招题目。

## 15:00-19:30 刷vj二招题目

1 m题

给定一个正整数n,编写一个程序,找出一个非零乘以m的n,其十进制表示只包含数字0和1。你可以假设n不大于200,对应的m包含不超过100个十进制数字。

本题我直接暴力递归,直到找到相符的退出。

代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int flag;
long long int n;
void ss(long long int i,int m)
{
    if(m>=20||flag) return;
    if(i%n==0){
        flag=1;
        printf("%lld\n",i);
        return;
    }
    ss(i*10,m+1);
    ss(i*10+1,m+1);
}
void main()
{
    while(scanf("%lld",&n)!=EOF&&n){
        flag=0;
        ss(1,1);
    }

    return;
}

2.c题

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

思路和走迷宫类似,用递归依次往下找与上方不同列的,进入是将此列标注等出递归时再取消标注。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int k,a[10];
long long int sum;
void ss(char s[][10],int i,int n,int m){
    int j;
    if(m==k) {sum++;return;}
    for(;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(s[i][j]=='#'&&a[j]==0){
                a[j]=1;
                ss(s,i+1,n,m+1);
                a[j]=0;
            }
        }
    }
    return;
}
void main()
{
    char s[10][10];
    int i,j,n;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        if(n==-1&&k==-1) break;
        sum=0;
        for(i=0;i<n;i++)
            a[i]=0;
    for(i=0;i<n;i++)
    {
        scanf("%s",s[i]);
    }
        ss(s,0,n,0);
        printf("%lld\n",sum);
    }

    return;
}

3.d题

牛牛子在地球过的不适应。现在,他想要回到母星牛牛星。假设地球和牛牛星都在一个坐标轴上,其中地球位于坐标n,而牛牛星位于坐标k。而牛牛子的飞船支持以下两种运动方式:

  1. 飞行:在一个时间单位中,能够从坐标x移动到x-1x+1
  2. 跃迁:在一个时间单位中,能够直接从x跃迁到2x

现在,牛牛子想知道,他需要多长时间才能到达牛牛星?

此题我是暴力将所有存在的项层层入队,并依顺序去找,因为次数少的在前面所以可以以此找到。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void main()
{
    long int a[100001],b[100001]={0},n,k,i,j;
    scanf("%ld%ld",&n,&k);
    a[0]=n;
    b[n]=0;
    if(n>k) printf("%ld\n",n-k);
    else{
    for(i=0,j=1;i<=100000;i++){
        if(a[i]==k) break;
        n=a[i]-1;
        if(n>0&&n<=100000&&b[n]==0)
        {
            a[j]=n;
            b[n]=b[a[i]]+1;
            j++;
        }
        n=a[i]+1;
        if(n>0&&n<=100000&&b[n]==0)
        {
            a[j]=n;
            b[n]=b[a[i]]+1;
            j++;
        }
        n=a[i]*2;
        if(n>0&&n<=100000&&b[n]==0)
        {
            a[j]=n;
            b[n]=b[a[i]]+1;
            j++;
        }
    }
    printf("%ld\n",b[a[i]]);
    }
    return;
}

写题出现的小毛病太多了,希望自己再接再厉,争取做的更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值