回复 lz1091914999
呵呵,我猜你也会说我格式不对的。不过首先还是感谢赠分
本来昨晚想等你回信的,可洗完澡后突然停电了,真是不好意思。
有一个问题你一直没有回答我,你这是ACM试题么?
关于格式,我必须解释一下。你认为不对是因为你希望先看到所有的输入,然后是所有的输出。我猜你还不理解什么是流。在控制台程序中,scanf从输入流是读取数据,printf向输出流写入数据。请注意,这是两个不同的流。一般标准的输入流是键盘,标准输出流是屏幕。但控制台会回显键盘输入,它和输出流按时间顺序混合在了一起。当你分离了两个流之后你就会看到标准的结果了。一个简单的方法是重定向流。比如重定向输入流。教你点东西。
假设在你的机器上我的解题程序编译为a.exe。
建立一个文本文件t.txt(和a.exe同目录)。将你的测试数据复制进去。
输入:a<t.txt
看看结果是什么。
上面将输入流重定向到文件。
你还可以试试这样:a<t.txt>t2.txt
执行完后你的目录下会多出t2.txt这个文件,打开看看。
这是将输出流重定向到文件。
举一反三,它们也都可以重定向到程序,由此也可以实现进程之间的信息交互,这就是传说中的管道通信技术,在unix中使用的很多。
scanf, printf这两个函数的强大功能就体现在这里。键盘屏幕的应用对这两个函数实在是太小儿科了。
以后你该知道如何测试大量数据了吧
当然你非要按你的想法做也没什么问题,只不过需要自己维护一个数据缓存区来缓存输出,也就是你代码中realloc部分。这个函数要慎用,这种练习类的编程我就不说什么了,当你做一个规模较的项目时一定要注意检查分配是否成功。
关于占用内存再谈谈我的看法。
时间和空间一直是编程的一对矛盾。想速度快就要消耗空间,想占地少就要牺牲速度。早期的电脑内存往往只有几十K,这一情况下,编程考虑空间的因果会比较多。而现在,我的电脑内存是4G。
就这一题为了存储地图信息,我用了2K的内存,每一个点有一个字节表示。你使用的是位,并且动态分配,所以在地图存储上你消耗的内存最多是我的1/8,确实比我少。但为这点内存你付出的代价是时间。动态分配内存需要时间就不说了。在基于位的运算中消耗了太多的时间。在获取一个位信息的过程中,你要调用一次函数,该函数有两个参数,需要做两次参数赋值,两次压栈,在函数体内需要做两次移位运算和一次与运算。而这些步骤需要在每次查询位时都重复一遍。对于置位操作你使用了参数宏,但只是增加了可读性,效率的改善并不大。
在我价值观下这样的代价过高。我原本考虑过用整型来保存点信息的,这样可以实现字段的对齐,可以进一步提高查询效率,但空间的消耗要再扩大4倍。所以用字节已经是一个折中的选择。
谈谈程序的可扩展性。你选择了一个很合适的变量类型__int64,每一位都没有浪费。
如果我们修改一下题目要求你会怎么做?
现在将地图的范围扩大到100 X 100。
我的代码只需要将那两个宏的数值改成100。你会怎么做?
最后的建议。
将功能部分单独建立函数,别混在main函数里。不便于阅读,也不便于修改。