博客被吞了一遍 我吐了想一点前上床睡觉有这么难吗..
虽然今天一天满课但是我还是学到了很多知识
今天启航oj 1
菜鸟杯补题 4
写了一篇关于党的19届六中全会的文章
主要学习了汉诺塔的数据变化原理,递归(加深我对递归的理解),二维数组的动态变化规律 进行了大量这种类型题目的联系 比如说蛇形矩阵啊 求一个二维数组中 边长为n的矩阵和的最小值等等,拿题说话
1.蛇形数组(好难)
#include<stdio.h>
#define N 1003
int main()
{
int book[3][2]={{0,1},{1,-1},{-1,0}};//这个是图形纵坐标横坐标变化的规律其中[3],代表他是一个三边形以此类推。
int T;
scanf("%d",&T);
while(T--)
{
int a[N][N]={0};
int num=1;
int i,j,n;
int tx,ty;
tx=ty=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
int count=n-i;//每完成一条边的赋值 边的长度都会减一
for(j=0;j<count;j++)
{
tx=tx+book[i%3][0];//tx ty是在book中每条边移动的规律
ty=ty+book[i%3][1];//比如说当i=0也就是第一条横边过程中的移动规律就是列一直加1直到跳出内循环进入下一条边移动的规律为止
a[tx][ty]=num++;//依次赋值,余数也就是模相等的话就是这两条边平行就是可以再完成一轮循环后再以每条边变化的规律进行赋值
}
}
for(i=0;i<n;i++)
{
for(int j=1; j<=n-i; j++)//因为是从纵列第一行开始赋值而不是第0行开始赋值的 所以j从1开始 j<=n-i是等边三角形的输出格式
if(j!=n)//这个语句是 因为oj比较恶心 当输出了每一行的最后一个数后不能存在空格否则会导致格式错误
printf("%d ",a[i][j]);
else
printf("%d",a[i][j]);
printf("\n");
}
printf("\n");
}
}
这种方法真是小刀拉屁股给我开了眼 以前从来没想过二维数组的边长变化问题还能这么做 正洋学长不愧是码圣的徒弟码怪,下面是我自己的思路做的这个题但是有bug因为只有第一轮循环有用之后的循环会覆盖之前的赋值不知道为什么有大佬看到了可以评论帮我改一下
#include<stdio.h>
int main()
{
int a[100][100];
int num=1;
int n,i,j;
scanf("%d",&n);
for(int m=1,k=n;m<=k;m++,k--)
{
for(i=m,j=m;j<=k;j++)//向右走
{
a[i][j]=num++;
}
for(i=m+1,j=k-1;i>=k,j>=m;i++,j--)//斜向下走
{
a[i][j]=num++;
}
for(i=k-1,j=m;i>=m+1;i--)//向上走
{
a[i][j]=num++;
printf("%d %d %d ",i,j,a[i][j]);
}
printf("\n");
break;
}
for(i=1;i<=n+1;i++)
{
for(j=1;j<=n-i+1;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
2.用递归求某一个数的位数以及他每个数位上的数字
#include<stdio.h>
int digits = 0;//定义全局变量
void YNB(int num)
{
if(num == 0)
{
return;
}
else
{
YNB(num/10);
digits++;//计算位数
printf("%d ",num%10);//取各位数字
}
}
int main()
{
int num;
scanf("%d",&num);
YNB(num);
printf("\n");
printf("%d",digits);
return 0;
}
这种方法的优点是可以在不知道一个数是几位数的情况下求他每一位上的数字以及他的位数
并且他的时间复杂度是log2n还很节省时间
今天真是充实的一天呢 菜鸟杯马上就要来了 明天和后天一定要把菜鸟杯热身赛的补题写完还有菜鸟杯涉及的算法全部复习一遍
加油