题目:
【问题描述】
盾哥最近迷上了一个智力游戏——超级消消看
游戏是这样的,有一个 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函数为什么不可以用