数组
【问题描述】
小苯在玩一个简化版的三消小游戏。棋盘有 5 行 5 列,每个格子里恰好有一个方块,颜色只可能是 R、G、B 三种之一,分别表示红、绿、蓝。当前棋盘如下:
R R G R G
G R R R R
G G R R G
B R G R B
R B G G G
游戏规则如下:
• 在某一轮中,如果一段连续方块颜色相同,且它们在同一行或同一列,并且长度至少为 3,那么这段方块中的所有格子都会被标记。
• 一轮中,所有被标记的格子会同时消除。
• 如果某个格子同时属于横向和纵向的可消除连续段,它也只会被消除一次。
• 一轮消除结束后,每一列中剩余的方块都会下落,填补这一列中的空位。
• 然后继续重复上述过程,直到棋盘上再也无法发生消除为止。
你的任务就是求出:当游戏最终停止时,棋盘上还剩多少个方块。
#include<iostream>
using namespace std;
void remov(int** p,int **re){
for(int i=0;i<5;i++){
int a=4;
for(int j=4;j>=0;j--){
if(re[j][i]==0){
p[a--][i]=p[j][i];
}
}for(int j=a;j>=0;j--){
p[j][i]=-1;
}
}
}int rec(int** p,int **re){
int k=0;
for(int i=0;i<5;i++){
for(int j=0;j<3;j++){
if(p[i][j]==p[i][j+1]&&p[i][j]==p[i][j+2]&&p[i][j]!=-1){
re[i][j]=re[i][j+1]=re[i][j+2]=1;
k++;
}
}
}for(int i=0;i<5;i++){
for(int j=0;j<3;j++){
if(p[j][i]==p[j+1][i]&&p[j][i]==p[j+2][i]&&p[j][i]!=-1){
re[j][i]=re[j+1][i]=re[j+2][i]=1;
k++;
}
}
}return k;
}
int main(){
char str[5][6]={
"RRGRG",
"GRRRR",
"GGRRG",
"BRGRB",
"RBGGG"};
int **p=new int*[5];
int** reco=new int*[5];
for(int i=0;i<5;i++){
p[i]=new int[5];
reco[i]=new int[5]();
for(int j=0;j<5;j++){
if(str[i][j]=='R'){
p[i][j]=1;
}if(str[i][j]=='G'){
p[i][j]=2;
}if(str[i][j]=='B'){
p[i][j]=3;
}
}
}
//start
while(1){
int k=rec(p,reco);
if(k==0){
break;
}else{
remov(p,reco);
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
reco[i][j]=0;
}
}
}
}
int num=0;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(p[i][j]>0){
num++;
}
}
}
cout<<num;
delete[] p;
return 0;
}
查看11道真题和解析