【消除类游戏】注意粗心点:matrix维度不要写错,简单部分也要好好写
小模拟,简单遍历;
进行两次遍历求每行每列可以消除的部分,时间复杂度为O(n^2);
RTE点:vector<vector<int>> matrix(n+1,vector<int>(m+1));别把n,m写错了;
其他:
使用【map】mpROW和mpCOL来存行和列的可以消除的点,并且只存末尾的点和Len,根据尾点和长度还原可消除位置;
另外就是 prev==matrix[i][j]也可能到达结束点,也就是到了矩阵末尾,这里要考虑;
其他就是中途截断,逻辑很好理解;
代码如下:
#include<iostream>
#include<map>
#include<vector>
using namespace std;
struct vertice{
int x,y;
bool operator <(const vertice&other)const{
if(x < other.x){
return true;
}
return y < other.y;
}
};
map<vertice,int>mpROW;//只记录结尾,ROW
map<vertice,int>mpCOL;//只记录结尾,COL
int main(){
int n,m;
cin >> n >>m;
vector<vector<int>> matrix(n+1,vector<int>(m+1));
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
cin >> matrix[i][j];
}
}
// for(int i = 0;i < n;i++){
// for(int j = 0;j < m;j++){
// cout << matrix[i][j]<<" ";
// }
// cout << endl;
// }
int prev = 0;
int Len = 0;
//按行遍历
// cout << "ROW:"<<endl;
for(int i = 0; i < n;i++){
for(int j= 0;j < m;j++){
if(j ==0){
prev = matrix[i][j];
Len = 1;
// printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[i][j],Len);
}else if(prev == matrix[i][j]){
Len++;
if(j == m-1){
if(Len >= 3){
// cout << mpROW.size()<<endl;
vertice v = {i,j};
mpROW.insert({v,Len});//满足,输入
}
}
// printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[i][j],Len);
}else{
if(Len >= 3){
// cout << mpROW.size()<<endl;
vertice v = {i,j-1};
mpROW.insert({v,Len});//满足,输入
}
// printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[i][j],Len);
prev = matrix[i][j];
Len = 1;
}
}
}
// cout << "COL:"<<endl;
for(int i = 0; i < m;i++){
for(int j= 0;j < n;j++){
if(j == 0){
prev = matrix[j][i];
Len = 1;
// printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[j][i],Len);
}else if(prev == matrix[j][i]){
// printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[j][i],Len);
Len++;
if(j == n-1){
if(Len >= 3){
vertice v = {j,i};
mpCOL.insert({v,Len});
}
}
}else{
if(Len >= 3){
vertice v = {j-1,i};
mpCOL.insert({v,Len});
}
// printf("prev = %d,matrix[%d][%d] = %d,len = %d\n",prev,i,j,matrix[j][i],Len);
prev = matrix[j][i];
Len = 1;
}
}
}
for(auto e:mpROW){
vertice v = e.first;
int Len = e.second;
int x = v.x;
int y = v.y;
// printf("ROW:x = %d,y = %d,len = %d\n",x,y,Len);
for(int i = 0;i < Len;i++){
matrix[x][y-i] = 0;
}
}
for(auto e:mpCOL){
vertice v = e.first;
int Len = e.second;
int x = v.x;
int y = v.y;
// printf("COL:x = %d,y = %d,len = %d\n",x,y,Len);
for(int i = 0;i < Len;i++){
// printf("clear x,y = %d,%d\n",x-i,y);
matrix[x-i][y] = 0;
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
cout << matrix[i][j]<<" ";
}
cout << endl;
}
}
里面存在很多劲爆的调试点。。。

浙公网安备 33010602011771号