13行代码AC_2017年省赛C组蓝桥杯第一题 贪吃蛇长度(考查文件读取)

励志用少的代码做高效表达


题目描述

±------------------------------------------------+
| |
| H###### #### |
| # # # |
| # # # |
| # #### # # |
| # # # # # |
| ######@### # # |
| # #### # # |
| # # # # # |
| ####@#######@### # # |
| # # # # # |
| T ##### # # # ## |
| # # ### ### ## |
| ################ # # #### |
| # # # # |
| ############## #######@########## |
| # ### |
| ########################### |
±------------------------------------------------+
小明在爷爷的私人收藏馆里找到一台老式电脑。居然没有图形界面,只能用控制台编程。
经过小明的一阵摸索,神奇地设计出了控制台上的贪食蛇游戏。
如上图,是游戏时画面截图。
其中,H表示蛇头,T表示蛇尾。#表示蛇的身体,@表示身体交叉重叠的地方。
你能说出现在的贪吃蛇长度是多少吗?
其实,只要数出#的数目算1,数出@的数目,算2,再加上头尾各算1就计算好了。
人工数一下?太累眼睛了,聪明的你为什么不让计算机帮忙呢?
本题的要求就是: 请填写上图中贪食蛇的长度是多少?
注意:需要提交的是一个整数,不要添加任何多余内容(比如说明或注释)


几种解法与思考

虽是水题, 但不影响我们从中学到点什么, 以下面两个解法为例拓展知识。

解法一: word查询字符
秉承能不写代码就不写代码(写代码易出错)的原则,我们可以将贪吃蛇copy到word文档中, 用word中的替换功能查找#和@出现的次数。 如图:

在这里插入图片描述


解法二:文件输入
用fstream中的ifstream做文件输出, 免除将贪吃蛇copy到代码中,统一格式的困扰。最后循环判断即可。
注意:在进行文件读取时,需要将代码与读取文件放在同一路径下,比如都放在桌面上。
代码:

#include<iostream>
#include<fstream> 
using namespace std;
int main() {
    
    
	ifstream fin("Snake.txt");
	char s; 
	int num = 2; 	//代表头和尾 
	while(fin >> s) {
    
    
		if(s == '#') num++;
		else if(s == '@') num+=2; 
	}
	cout << num << endl;
return 0; } 

解法三:常规方法
直接将贪吃蛇copy到字符串数组中, 循环判断
注意:直接将贪吃蛇copy进来会报错, 一种解决办法是:将所有字符都放在一行里。
另一种解决办法是:使用续行符(反斜杠)。
续行符相关知识——>传送门

续行符代码示例:

#include<iostream>
#include<fstream> 
using namespace std;
int main() {
    
    
	string s = {
    
    "\
	+-------------------------------------------------+\
|                                                 |\
|    H######                      ####            |\
|          #                      #  #            |\
|          #                      #  #            |\
|          #     ####             #  #            |\
|          #     #  #             #  #            |\
|          ######@###             #  #            |\
|                #       ####     #  #            |\
|                #       #  #     #  #            |\
|            ####@#######@###     #  #            |\
|            #   #       #        #  #            |\
| T          #####       #        #  #   ##       |\
| #                      #      ###  ### ##       |\
| ################       #      #      ####       |\
|                #       #      #         #       |\
|   ##############       #######@##########       |\
|   #                         ###                 |\
|   ###########################                   |\
+-------------------------------------------------+\
	"} 
	int num = 2; 	//代表头和尾 
	while(fin >> s) {
    
    
		if(s == '#') num++;
		else if(s == '@') num+=2; 
	}
	cout << num << endl;
return 0; } 

总结

题目虽小, 但如果我们以优化,精进的角度看这道题, 还是有很多可取之处的。
1 对于大量处理输入数据的题目, 可以使用文件输入的方法,在蓝桥杯中应用很广泛。
2 使用续行符, 可以使代码可读性提高
3 蓝桥杯重应用,灵活使用word、excel等软件可以避免麻烦的编程


努力只能及格,拼命才能优秀! 加油,陌生人!

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/109025148
今日推荐