博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法竞赛入门经典_3.1_数组_逆序输出_开灯问题
阅读量:4699 次
发布时间:2019-06-09

本文共 2655 字,大约阅读时间需要 8 分钟。

又是新的一天,继续更新.

今天进入了新的章节,数组和字符串

1.逆序输出问题:

先来看代码吧

#include 
//逆序输出 2017-8-16#define maxn 105int a[maxn];int main(int argc, char* argv[]){ //int a[maxn]; int x, n = 0; while (scanf("%d", &x) == 1) a[n++] = x; for (int i = n - 1; i >= 1; i--) printf("%d ", a[i]); printf("%d\n", a[0]);//输出的行首和行尾一般均无空格,所以用两条语句实现输出 return 0;}

注意:数组一般会声明得稍大一些

这是一个逆序输出问题,但需要注意的是在定义数组的时候,要在main函数之外定义,如果遇到maxn很大,如1000000,则程序将无法运行,下面截图为证

直接结束了,所以我们应该放外面,再看

放外面就正常运行了,然后看看效果截图吧

 

2.开灯问题:

看代码

//开灯问题 2017-8-16#include 
#include
#define maxn 1010int a[maxn];int main(int argc, char* argv[]){ int n, k, first = 1; memset(a, 0, sizeof(a)); scanf("%d%d", &n, &k); for (int i = 1; i <= k; i++) for (int j = 1; j <= n; j++) if (j % i == 0) a[j] = !a[j]; for(int i = 1; i <= n; i++) if(a[i]) { if (first) first = 0; else printf(" "); printf("%d", i); } printf("\n"); return 0;}

  这里有很多新的知识点了,首先是string.h中的memcpy(b,a,sizeof(int)*k)是将a数组复制给b,大小为k,

如果想全部复制,可以使用memcpy(b,a,sizeof(a)),还有一个函数,也就是本程序出现的memset(a, 0, sizeof(a));

是将数组a中的数据置为0.

  值得注意的是,我们定义了first变量,这个变量是干什么的呢?很显然它是一个标志是否是第一个数据的变量,

因为在输出的时候,第一个数前面是不需要空格的.

看运行结果

3.蛇形填数:

这个问题博主还没解决,不知道为什么和书上代码一样,运行却有问题

搞笑了,博主刚好想贴代码的时候检查了下代码,发现是第22while循环条件搞错了,应该是向上移动x-1 >= 0(我之前写成了<,这告诉大家,写代码如果遇到了一些很奇怪的运行结果,试着检查自己的代码,特别是循环条件)

//蛇形填数问题 2017-8-16#include 
#include
#define maxn 20int a[maxn][maxn];int main(){ int n, x, y, tot = 0; scanf("%d", &n); memset(a, 0, sizeof(a)); x = 0; y = n - 1; a[x][y] = 1; tot = 1; //tot = a[x = 0][y = n - 1] = 1;//这条语句很简洁,也可以使用这句替代上面的四条语句 while (tot < n*n) { while (x + 1 < n && !a[x + 1][y]) a[++x][y] = ++tot; while (y - 1 >= 0 && !a[x][y - 1]) a[x][--y] = ++tot; while (x - 1 >= 0 && !a[x - 1][y]) a[--x][y] = ++tot; while (y + 1 < n && !a[x][y + 1]) a[x][++y] = ++tot; } for (x = 0; x < n; x++) { for (y = 0; y < n; y++) printf("%3d", a[x][y]); printf("\n"); } return 0;}

分析:从1开始填写,设置笔的起始坐标为(x,y),也就是(0,n-1)了,x代表行,y代表列,所以笔的移动轨迹是下,下,下,左,左,左,上,上,上,右,右,下,下,左,上

在这里我们只需要判断两个条件

  • 一个是是否超出边界,在下移动的轨迹中,也就是x+1<n
  • 另一个是是否填了以前填过得格子,所以是a[x+1][y] == 0的条件,简写为!a[x+1][y]

有了这一思路,就好解了看运行结果吧

在这一练习中,我们可以学到的:

1)可以利用c语言简洁的语法,但前提是保持代码的可读性

2)在很多情况下,最好是在一件事之前检查是不是可以做,而不是在做完之后再后悔,因为"悔棋"往往是比较麻烦的.

发现做算法,其中还是可以学到很多,而且很有趣

生活中也是,我们在做某件事的时候,要考虑是不是应该做,因为后悔药是很难买的,就好比博主熬夜写博客,

现在还是可以接受的,如果天天如此身体也是会吃不消的,好了今天到这里了,各位同行们也早点休息,注意身体.

晚安世界!

转载于:https://www.cnblogs.com/ncgds/p/7376790.html

你可能感兴趣的文章
NYOJ--32--SEARCH--组合数
查看>>
JMS
查看>>
gulpfile 压缩模板
查看>>
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>
【 henuacm2016级暑期训练-动态规划专题 A 】Cards
查看>>
第五篇:白话tornado源码之褪去模板的外衣
查看>>
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
MockObject
查看>>
BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
查看>>
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
FindChildControl与FindComponent
查看>>
中国城市json
查看>>
android下载手动下载Android SDK
查看>>
C++学习:任意合法状态下汉诺塔的移动(原创)
查看>>