解题思路
代码实现了一个消除类游戏的逻辑,游戏的基本规则是在一个二维棋盘上,当一行或一列中有三个或更多相同颜色的棋子连续排列时,这些棋子会被消除。
-
数据结构设计:结构体
MyPoint
,包含两个成员:num
表示棋子的颜色编号,match
用一个布尔值表示该位置的棋子是否可以被消除(初始化为false
)。 -
初始化棋盘:首先,程序读入两个整数
n
和m
,分别代表棋盘的行数和列数。然后,创建一个n
行m
列的graph
二维数组,数组的元素类型为MyPoint
,并读入棋盘上每个位置的棋子颜色。 -
横向检查:对棋盘的每一行进行遍历,使用变量
flag
记录当前连续相同颜色棋子的数量,lastNum
记录上一个棋子的颜色。当遍历到不同颜色的棋子时,检查flag
是否大于等于3,如果是,则将这一段连续相同颜色的棋子标记为可以消除(即设置它们的match
为true
)。如果到达行的末尾并且有连续相同的棋子,也进行相同的检查和标记。 -
纵向检查:这一步与横向检查类似,但是是对棋盘的每一列进行遍历。同样使用
flag
和lastNum
来跟踪连续相同颜色棋子的数量和颜色,并进行相应的标记。 -
输出结果:最后,遍历整个棋盘,对于每一个位置,如果
match
为true
,则输出0(表示该棋子被消除),否则输出该位置棋子的颜色编号。每输出一行后换行。
完整代码
#include <iostream>
#include <vector>
using namespace std;
struct MyPoint
{
int num;
bool match; // 1-可以消除
};
int n, m;
int main() {
cin >> n >> m;
vector<vector<MyPoint>>graph(n, vector<MyPoint>(m, { 0,0 }));
for (auto& it : graph) {
for (auto& jt : it) {
cin >> jt.num;
}
}
for (size_t i = 0; i < n; i++) {
int flag = 1, lastNum = -1;
for (size_t j = 0; j < m; j++) {
if (lastNum != graph[i][j].num) {
if (flag >= 3) {
for (size_t k = 0; k < flag; k++) {
graph[i][j - k - 1].match = 1;
}
}
flag = 1;
lastNum = graph[i][j].num;
}
else {
flag++;
if (flag >= 3&&j == m - 1) {
for (size_t k = 0; k < flag; k++) {
graph[i][j - k].match = 1;
}
}
}
}
}
for (size_t i = 0; i < m; i++) {
int flag = 1, lastNum = -1;
for (size_t j = 0; j < n; j++) {
if (lastNum != graph[j][i].num) {
if (flag >= 3) {
for (size_t k = 0; k < flag; k++) {
graph[j - k - 1][i].match = 1;
}
}
flag = 1;
lastNum = graph[j][i].num;
}
else {
flag++;
if (flag >= 3&&j == n - 1) {
for (size_t k = 0; k < flag; k++) {
graph[j - k][i].match = 1;
}
}
}
}
}
for (auto& it : graph) {
for (auto& jt : it) {
if (jt.match) cout << 0 << " ";
else cout << jt.num << " ";
}
cout << endl;
}
return 0;
}