欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

CCF消除类游戏(满分代码+解题思路+技巧总结)201512-2

时间:2023-06-05
技巧总结

有时候思考一个问题,要多以计算机的角度思考
也许一个一个点的判断过程看起来很”笨“,但是正常思维的”先判断整一串是否要消除,再来消除“的代码实现更加繁琐

题目描述
解题思路

该题数据范围不大,可以采用纯模拟暴力解题判断这一连串是否要消除可以思考成当前该点是否应该消除从该点上下左右移动指针,当数值相等时,指针移动,通过指针间距判断是否满足三个及以上相等
代码实现

#include #include #include using namespace std;const int N = 35;int n, m;int a[N][N];bool b[N][N];int main(){ cin >> n >> m; for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { cin >> a[i][j]; } } //遍历每一个点,判断其是否会被消除 for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { int z = j, y = j, s = i, x = i; //设立四个指针 while (z >= 0 && a[i][z] == a[i][j]) z --; //结束循环时,指针指向当前第一个不满足条件的位置 while (y < m && a[i][y] == a[i][j]) y ++; while (s >= 0 && a[s][j] == a[i][j]) s --; while (x < n && a[x][j] == a[i][j]) x ++; if (y - z >= 4 || x - s >= 4) b[i][j] = true; //例如3,4,5这三个空格恰好同色,那么当前指针z = 2, y = 6,所以应该>= 4 //当其左右或上下有连续三个及以上相同时,则该点会被消除 } } for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { if (!b[i][j]) cout << a[i][j] << " "; else cout << 0 << " "; } cout << endl; } return 0;}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。