1 条题解
-
0
达拉崩吧斑得贝迪卜多比鲁翁 vs 昆特牌提琴烤蛋挞苏打马拉松
本人还挺喜欢这道题的,所以写个题解
绝对不是因为写的爽本题唯一难点在于输入,这个解决了都好做,不得不吐槽一下C语言的字符串输入真是太烂了
另外,题目有几点没说清楚: 1.你不需要判断这是第几招,输入的20行分别对应这四招,且顺序和题目描述中的顺序一致 2.每个5x5方格间互不影响 (废话)
写前你需要先斟酌一下,输入到底是存成字符还是整型。我是存成了字符,一是考虑到后面不会有对其中数字进行运算(大小比较除外,反正也不麻烦),二是输入比较简单
第一招
没啥好说的,有很多方法都可以判断攻击方向,这里给出我的方法
int dir = 0; for(int i = 0;i < 5;i++){ if(attack[i][0] == '1' && attack[i][1] == '1'){ dir = 0; break; }//横着攻击 } for(int i = 0;i < 5;i++){ if(attack[0][i] == '1' && attack[1][i] == '1'){ dir = 1; break; } } for(int i = 0;i < 5;i++){ for(int j = 0;j < 5;j++){ if(dir == 0){ //竖着回击 if(j == 2) defense[i][j] = '1'; else defense[i][j] = '0'; } else if(dir == 1){ if(i == 2) defense[i][j] = '1'; else defense[i][j] = '0'; } } }第二招略
第三招
有点难度,但注意到需要更改的格子数比较少,所以我直接定义了三个数组,存坐标的偏移
int max_num = 0,pos_x = 0,pos_y = 0; for(int i = 0;i < 5;i++){ for(int j = 0;j < 5;j++){ int num = (int)(attack[i][j] - '0'); if(num > max_num){ max_num = num; pos_x = i; pos_y = j; } } } for(int i = 0;i < 5;i++) for(int j = 0;j < 5;j++) defense[i][j] = '0'; //开始绘制伤害 int x_shift[12] = {0,1,0,-1,0,1,2,1,0,-1,-2,-1}; int y_shift[12] = {-1,0,1,0,-2,-1,0,1,2,1,0,-1}; char pos_value[12] = {'2','2','2','2','1','1','1','1','1','1','1','1'}; defense[pos_x][pos_y] = '3'; for(int i = 0;i < 12;i++) if(pos_x + x_shift[i] < 5 && pos_y + y_shift[i] < 5 && pos_x + x_shift[i] >= 0 && pos_y + y_shift[i] >= 0) defense[pos_x + x_shift[i]][pos_y + y_shift[i]] = pos_value[i];第四招略
输入注意事项
一般字符串输入还是建议用fgets和scanf_s 这道题不建议用fgets,因为测试点有点奇怪,可能会出一些奇怪的问题
进一步解释一下fgets和scanf的区别 简单来说,fgets再读字符串的时候会包含空格,遇到换行才停止 scanf遇到空格就会停了
这道题因为输入的字符串中间并无空格,所以scanf就可以了
- 1
信息
- ID
- 555
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 62
- 已通过
- 3
- 上传者