【2014广州市选day1】消除游戏【蒟蒻的小题解】

Description

相信大家玩过很多网络上的消除类型的游戏,一般来说就是在一个大拼图内找出相同的部分进行最大程度的消除操作。下面我们给出一个拼图以及消除规则,请你找到最大限度的消除方案。

【拼图组成】
拼图为 N行 * M列 的矩阵,每个格子中都放着一个数字,范围是0到9。例如:
4*5 矩阵:
在这里插入图片描述

【消除规则】
我们可以从拼图的任意一个格子(坐标【X,Y】)出发,消除该格子的数字,然后,向格子X坐标正负1,Y坐标正负1的范围,寻找和原来格子相同的数字(不能找已经消除过的格子),一并消除,然后在新的格子继续重复上述过程,直到找不到相同的数字为止。这个过程称为消除过程。上面的矩阵中,我们可用以下几种消除方案:
在这里插入图片描述

Input

输入第一行为两个整数N (1<=N<=30),M(1<=<=30),用空格隔开下面N行,每行有M个整数(范围0到9)

Output

输出一行为两个整数 X,Y,中间用一个空格隔开,其中X代表消除的数字,Y代表最大的消除数目。
如果一个拼图中有多个数字可以消除相同的最大的数目,那么则输出数字最小的那个解。

Sample Input

4 5
12345
22340
09070
12300

Sample Output

0 5

分析

这题就两个字:深搜

我们只需要枚举每一个点,并从这个点往八个方向深搜每一个点,然后求最大路径就可以,非常简单。

不会有人看到这还不会做吧,不会吧不会吧。

如果还不会那就只能放CODE了呢

//L.E.M.T专用水印
#include<cstdio>
#include<algorithm>
int n,m,ans,ans1,bj[105][105],a[105][105];
int fx[8]={
    
    0,0,-1,-1,-1,1,1,1};
int fy[8]={
    
    -1,1,0,-1,1,0,-1,1};
using namespace std;
void dfs(int x,int y,int s) {
    
    
	if (s>ans) ans1=a[x][y],ans=s;
	else if (s==ans)
		 if (a[x][y]<ans1) ans1=a[x][y];
	for (int i=1;i<=8;i++) {
    
    
		int xx=x+fx[i],yy=y+fy[i];
		if (xx>0&&xx<=n&&yy>0&&yy<=m&&bj[xx][yy]==0&&a[xx][yy]==a[x][y]) {
    
    
			bj[xx][yy]=1,dfs(xx,yy,s+1),bj[xx][yy]=0;
		}
	}
}
int main() {
    
    
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) {
    
    
		for (int j=1;j<=m;j++) {
    
    
			char ch=getchar();
			while (ch<'0'||ch>'9') ch=getchar();
			a[i][j]=ch-'0';
		} 
	}
	ans=0,ans1=0x3f3f3f3f;
	for (int i=1;i<=n;i++) 
		for (int j=1;j<=m;j++) bj[i][j]=1,dfs(i,j,1),bj[i][j]=0;
	printf("%d %d",ans1,ans);
}

不会TLE!!!

猜你喜欢

转载自blog.csdn.net/qq_49972640/article/details/108551381
今日推荐