自己易犯的小错误

1.scanf

scanf 从输入缓冲区中读数据,一般情况下,如果读到回车、空格之类的空白字符,会返回,但如果格式是%c,则会把这个空白字符也取出来,这种机制可能会造成问题。解决的办法貌似有三种:一,使用%s而不是%c;二,在scanf之前用while((c=getchar())!='\n’)来忽略掉所有的回车(其他空格符同理);三,使用fflush(stdin)来刷新缓冲区。

2.有关图的数据结构

一般有三种方式存储图,第一种,邻接矩阵;第二种,与邻接矩阵相似,不过行是顶点,列是边;第三种,邻接链表。编程实现的时候,用vector的数组比较方便,与二维数组相比,更加灵活,而且节省了空间。当考虑数组的长度不固定时,首先应当想到的是vector list 这样的容器,而不是想到new来动态分配大小。

3.拓扑排序

本科时学的图论,只记得是用深搜可以做,昨天翻了算法导论,看了一下证明,很简单。注意的就是做的时候要判断是否是反向边(本科的教材成为回边),编程实现的时候,维护vis数组三种状态,-1表示正在访问,0表示未访问,1表示访问过了。访问过了的顶点,加在输出的前面,因为最后拓扑排序的结果实际上深搜结束时间从晚到早排序的,先结束的在右侧。

4.要不要给图加一圈边界

这道题的亮点在于为了不判断边界条件,在图的外围加了一圈,真是太方便了。可后来在走迷宫的时候我想用同样的方法,结果非常麻烦,现在的理解是走迷宫需要编号,在外面加一层的话,不好控制,最后全部用的一维数组存的,上下左右四个节点的边界判断顿时很简单了。

5.有关暴力求解

其实暴力求解没有想象中的那么暴力,没用思路的问题往往可以考虑这个方法。题目中一般会给出输入的限定,这个限定范围比较小,但是用纯暴力又会超时。通过分析题目的条件,一般可以找出隐含的范围限定(可以考虑不等式等条件)。

6.满足条件的数目达到多少后结束算法

最近写的那几道题,总是在退出条件中出错,如果并不是编译出错,也总是有输出,就该考虑是不是计数的那个变量在循环中的层次放错了,或者是不是忘记每次开始之前要清零了。对于使用STL中的容器,也要注意用完清空的问题。室友说竞赛一般不用使用指针来节省空间,因此释放指针之类的不用考虑,直接开够大的数组即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值