站外题求助
  • 板块题目总版
  • 楼主xxfnm
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/25 17:11
  • 上次更新2024/8/25 20:08:39
查看原帖
站外题求助
1200209
xxfnm楼主2024/8/25 17:11

这题几乎是一道大模拟染色了,重力系统始终摸不着头脑,mg函数递归调用也有问题,求调

题目:

【问题描述】
盾哥最近迷上了一个智力游戏——超级消消看
游戏是这样的,有一个 5*5 的正方形网格,每个格子中有一个大于 0 且小于 4 的整数,
对于一个确定的局面,若一个格子与它上下左右四个方向的某个格子(如果存在)数字相同,
则称这两个格子是连通的,并且这种连通具有传递性
每次,你可以选择一个格子,若与这个格子连通的格子(包括自己)数大于等于 3,你
就可以选择消掉这个格子,与此同时,与这个格子连通的所有格子会一起消失
当然这对于盾哥来说太简单了,因为无论如何消,最后的结果都是一样的,所以我们引
入了重力系统,每次选择消掉某个格子,并将与那个格子相连通的所有格子都消掉后,将会
有一些格子失去支撑,此时那些格子就会因重力而下落
这下盾哥也无能为力了,于是他求助于你,怎样玩才能使得最后剩下的不能消掉的格子
尽量少
【输入文件】
一个 5*5 的矩阵描述正方形网格
【输出文件】
一个数表示最后剩下的不能消掉的格子最少是多少
【输入样例】
3 1 2 1 1
1 1 1 1 3
1 1 1 1 1
1 1 1 1 1
3 1 2 2 2
【输出样例】
3

代码

#include "iostream"
using namespace std;
int map[6][6];
bool ch[6][6];
int _dx[5]={0,1,0,0,-1};
int _dy[5]={0,0,1,-1,0};
void mg(int x, int y) {
    if (x == 5) return;
    if (ch[x][y]) {
        mg(x+1, y);
    } else {
    	if(ch[x+1][y]==false)
    	{
    		map[x+1][y]=map[x][y];
    		ch[x][y]=true;
		}
        mg(x+1, y);
    }
}
void _dfs(int x,int y,int n,bool is_can)
{
	int de_time = 1;
	bool _is_return = false;
	if(is_can==false)
	{
		for(int i = 1; i <= 4; i++)
		{
			if(map[x+_dx[i]][y+_dy[i]]==n and !ch[x+_dx[i]][y+_dy[i]])
			{
				de_time++;
			}
		}
	}
	if(de_time >= 3||is_can==true)
	{
		is_can=true;
		ch[x][y] = true;
	}
	if(is_can){		
		for(int i = 1; i <= 4; i++)
		{
			if(map[x+_dx[i]][y+_dy[i]]==n and !ch[x+_dx[i]][y+_dy[i]])
			{
				ch[x+_dx[i]][y+_dy[i]] = true;
				_is_return = true;
				_dfs(x+_dx[i],y+_dy[i],n,is_can);
			}
		}		
	}
	else return ;
}
void try_print()
{
	for(int i = 1; i <= 5; i++)
	{
		for(int j = 1; j <= 5; j++)
		{
			if(!ch[i][j])
				cout << map[i][j]<<" ";
			else cout << "x" <<" ";
		}
		cout << "\n";
	}
}
int main()
{
	for(int i = 1; i <= 5; i++)
	{
		for(int j = 1; j <= 5; j++)
		{
			cin >> map[i][j];
		}
	}
	for(int i = 1; i <= 5; i++)
	{
		for(int j = 1; j <= 5; j++)
		{
			if(ch[i][j]==0) _dfs(i,j,map[i][j],false);
			for(int k = 1; k <= 5; k++) mg(k,1);
			try_print();
			cout << endl;
		}
	}
	try_print();
}

这题还在调试阶段,求最优情况如何实现以及mg函数为什么不可以用

2024/8/25 17:11
加载中...