3663 - 开心消消乐

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

消消乐是一款老少皆宜的游戏,玩法也多种多样,现在我们这款消消乐在 6*6 格子的游戏池中进行。每个格子中

有一个数字表示方块,每种数字代表不同的方块类型。鼠标点击格子中的方块,如果该方块相连有4个或以上

(总的相同方块数>=5)的相同种方块,则可以消去该方块极其周围与该方块相连的方块。消去方块后原来有方

块的位置变成空白区域,空白区域上方的方块受到引力作用回向下落,下落完成以后,如果新的6*6方格中有空

白列,则空白列右边的所有方块向左移动,直到与左边的方块对接。给定原来的6*6方格和鼠标点击位置,要求

输出消去后的6*6方格,如果不能消去,则直接输出”Can’t”

<span></span>

题目输入

每个测试7行,第1行两个数nm(中间用空格分开)分别表示鼠标点击的行列坐标,后6行每行六个数,表示方块

原来的位置,每种数表示一种方块,保证方块种类只有1 2 3 4 5这五种,输入时两个数间没有空格

<span></span>

题目输出

对于每个测试数据,如果可以消去,则输出消去后的6*6方格,空白区域用0表示,两种方格之间不要有空格;如

果不能消去,则直接输出”Can’t”

输入/输出样例

输入格式

1 1
123121
111312
321321
253123
321123
222312
3 3
111111
221122
331133
111113
331333
121343

输出格式

000121
020312
323321
253123
321123
222312
000000
000020
220230
330330
333330
123430

C语言解答

#include<stdio.h>
int x[6][6],t,c;
void xiao(int m,int n)
{
	if(m>0&&x[m-1][n]==t){c++;x[m-1][n]=0;xiao(m-1,n);}
	if(m<5&&x[m+1][n]==t){c++;x[m+1][n]=0;xiao(m+1,n);}
	if(n>0&&x[m][n-1]==t){c++;x[m][n-1]=0;xiao(m,n-1);}
	if(n<5&&x[m][n+1]==t){c++;x[m][n+1]=0;xiao(m,n+1);}
}
void he1()
{
	int i,j,k;
	for(k=0;k<5;k++)
		for(i=5;i>0;i--)
			for(j=0;j<=5;j++)
				if(x[i][j]==0)
				{
					x[i][j]=x[i-1][j];
					x[i-1][j]=0;
				}
}
void he2()
{
	int i,j,k,l;
	for(l=0;l<5;l++)
		for(j=0;j<5;j++)
			for(i=0;i<6;i++)
			{
				if(x[i][j]!=0)break;
				if(i==5)
					for(k=0;k<6;k++)
					{
						x[k][j]=x[k][j+1];
						x[k][j+1]=0;
					}
			}
}
void p()
{
	int i,j;
	for(i=0;i<6;i++)
	{
		for(j=0;j<6;j++)
			printf("%d",x[i][j]);
		printf("\n");
	}
}
int main()
{
	int i,j,n,m;
//	freopen("test.in","r",stdin);
//	freopen("test.out","w",stdout);
	while(scanf("%d%d",&m,&n)==2)
	{
		for(i=0;i<6;i++)
			for(j=0;j<6;j++)
				scanf("%1d",&x[i][j]);
		m--;n--;
		t=x[m][n];x[m][n]=0;
		c=1;xiao(m,n);
		if(c>=5){he1();he2();p();}else printf("Can't\n");
	}
	return 0;
}

C++解答

#include <bits/stdc++.h>
using namespace std;
int d[10][10];
int dd;
void dfs(int x,int y,int data){
	
	if ((x<1||x>6||y<1||y>6||d[x][y]!=data)) return;
	
	dd++;
	
	d[x][y]=0;
	
	dfs(x-1,y,data);
	dfs(x+1,y,data);
	dfs(x,y-1,data);
	dfs(x,y+1,data);
	
}

void move(){
	
	for (int i=6;i>=2;i--){
		for (int s=1;s<=6;s++){
			if (d[i][s]==0){
				swap(d[i][s],d[i-1][s]);
			}
		}
	}
	
	for (int i=1;i<6;i++){
		int ok=1;
		for (int s=1;s<=6;s++){
			if (d[s][i]!=0){
				ok=0;
			}
		}
		
		if (ok){
			for (int s=1;s<=6;s++){
				swap(d[s][i],d[s][i+1]);
			}
			ok=0;
		}
		
	}
	
}

void print(){
	for (int i=1;i<=6;i++){
		for (int s=1;s<=6;s++){
			printf("%d",d[i][s]);
		}
		printf("\n");
	}
}

int main()
{
	int n,m;
	while(~scanf("%d%d",&n,&m)){
		dd=0;
		char as[10][10];
		for (int i=1;i<=6;i++){
			scanf("%s",as[i]);
		}
		
		for (int i=1;i<=6;i++){
			for (int s=0;s<6;s++){
				d[i][s+1]=as[i][s]-'0';
			}
		}
		

		
		dfs(n,m,d[n][m]);
		
		
		if (dd<=4){
			printf("Can't\n");
			continue;
		}
		for (int i=0;i<6;i++)
			move();
		
		print();
		
	}
	return 0;
}