Re: [问题] ACM Q10189 - Minesweepe

楼主: s25g5d4 (function(){})()   2014-11-10 23:14:12
这题我看过,本来我以为我写过结果没有
所以花了一点时间写一份...当然我不会贴上来 :P
几个建议:
1. include stdio.h 建议写成 cstdio 比较符合 C++ 惯例
2. cin 与 scanf 不要混用
因为两者视 implement 不同,混用会有神奇的 bug 出现
cout 与 printf 也是一样的不要混用
可能有人会告诉你 scanf, printf 比较快之类的
不过我比较倾向哪个熟练就用哪个
3. 阵列初始化可以参考 cstring (string.h) 的 memset
这个函数可以一次把一整块内存空间归零
比你用循环慢慢跑还快
4. 用 cin 读取时要注意把 \n (换行字符) 吃进来丢掉
4 4\n
*...\n
....\n
.*..\n
....\n
这个测资用 cin 把 4 4 读进来以后后面的 \n 要记得把它吃进来丢掉
像这样:
cin >> row >> col;
cin.ignore(); // 把换行从 stdin 中移除(忽略)
5. 既然要用字符阵列存,可以去查查 cin.getline() 一次读一整行
这个函数会把换行自动吃掉而且不会存到阵列中
6. 程式主要逻辑上建议改成“遇到地雷就把八个方向的邻格数字 +1”
而不是“每一非地雷格都检查附近有几颗地雷”
这样会少跑好几次循环,效能比较好
所以这样的话一开始要把整个阵列初始化为全填零
然后开始一格一格扫,遇到地雷就把邻格 +1, 并且把地雷那格标上记号
这边有个小技巧就是因为每格非地雷数字最多就 8 了
所以只要大于 8 的数字就是地雷
也就是说地雷那一格直接把数字填 9 就好
遇到相邻的地雷也不用特别判断,直接 +1
因为地雷一定大于8, 再 +1 还是地雷
7. 根据刚刚 AC 的结果来看,输出格式应该是这样:
Field #1:\n
*100\n
2210\n
1*10\n
1110\n
\n
Field #2:\n
**100\n
33200\n
1*100\n
所以每一行输出都要有换行,每组输出中间有一空白行

Links booklink

Contact Us: admin [ a t ] ucptt.com