1、需使用函数时,有有返回值函数和无返回值函数两种类型。
对于有返回值函数,直接返回需要的值即可。
对于无返回值函数,往往是想简化main函数,这样如果函数中的变量已经被命名为全局变量,无需传递参数;如果仅仅是局部变量,就会遇到参数的传递问题。此时没有返回值,函数中对变量做出的改变无法同步到main函数中。这时就需要在实参和形参之间用地址连接,将改变的地方变成地址,即可真正实现同步效果。
例:交换两个数。参考博文:click here。与此同时,尽量使用引用传递。
2、尽量不要用scanf输入字符%c,会有各种各样的坑等着你,尽量用cin和getline代替。
3、用getline之前若有scanf,必须用getchar吸走之前的空格。
4、dev编译器在main内部无法开出1000000的数组,若必须要开的话将这个数组定义成全局变量。
5、数组题目允许的话尽量开大些,在时间有限的情况下可以降低bug出现的频率。
6、for循环的条件中尽量不要出现四则运算,将条件写在外面,否则会报莫名其妙的错。
7、有时候超时的原因是因为数据类型写错了,比如hdu3999。
8、如果结构体倾向于作为存储功能,适宜用参数初始化表法初始化;
如果结构体倾向于对其直接操作,适宜于用结构体数组直接初始化。
9、搜索相关:
(1)、一般来说,深搜因为只能返回一个值所以返回的都是布尔变量,表示能否搜到,也就是处理解是否存在的问题。这样的话,如果想输出结果,就需要在递归底层输出。
(2)、而广搜因为不需要判断是否有解所以可以返回其他类型,用结构体处理较好。
(3)、dfs分为输出类和判断类,输出类由于要输出所有解,故需要遍历所有方向。判断类通常只有一个解,故当前方向如果可行返回即可。
10、八皇后相关:
(1)、如果当前元素的正上方,主对角线,副对角线方向都没有皇后,则可以放。
(2)、正对角线条数(9),副对角线条数(9)。
(3)、列数组,正对角线数组,副对角线数组。
(4)、因为每一行只能放一个元素,所以每遍历一次如果他可以放(即对应列和两个对角线上都没皇后)就标记一个,代表这个元素放置后他的列以及对角线都被占用,如此不断递归即得答案。
11、编译器问题:
(1)、关于输入,float用%f,double用%lf;而输出时,无论是float还是double,都用%f。否则G++过不了C++能过。
(2)、hdu中G++比C++要慢,所以若G++超时可以换成C++。
12、涉及字符或字符串的输入,果断用cin,用scanf的话会很恶心。
13、数组下标为字符,存入的是字符的ascii码,所以要把数组开到ascii码那么大。既然下标既可以为字符也可以为数字,那么这个字符的ascii码和数字是等效的,最后数组得到的值是后赋予的值。
比如对于一个int数组arr[105],若先赋值arr[68] = 1,再赋值arr['D'] = 2,最后得到的是arr[68]和arr['D']都是2,可见后者覆盖了前者。反之同理。