请dalao帮忙看看,很急
查看原帖
请dalao帮忙看看,很急
374722
gongchuqiao楼主2021/8/15 15:14
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAXN = 100 + 10;
const int MAXM = 10 + 5;

bool f[MAXN][MAXM];//判断是否来过
int g[MAXN][MAXM];//棋盘

int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};

int n, k;
int num;
bool flag;

void init()//初始化
{
	for (int i = 1;i <= MAXN - 5;i++)
		for (int j = 1;j <= 10;j++)
			f[i][j] = false;
}

void dfs(int x, int y, int op)//大法师
{
	f[x][y] = true;
	for (int i = 0;i <= 3;i++)
		if (f[x + dx[i]][y + dy[i]] == false && g[x + dx[i]][y + dy[i]] == op)
		{
			num++;
			dfs(x + dx[i],y + dy[i],op);
		}
}

void down()//下落
{
	for (int i = n;i >= 1;i--)//这里要倒过来
	{
		for (int j = 1;j <= 10;j++)
		{
			if (g[i][j] != 0)
			{
				int w = i;
				while (g[w + 1][j] == 0 && w <= n)
					w++;
				if (w != i)//变化
				{
					g[w][j] = g[i][j];//复制
					g[i][j] = 0;//清零
				}
			}
		}
	}
}

int main()
{
	scanf("%d %d", &n, &k);
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= 10;j++)
			scanf(" %d", &g[i][j]);
	flag = true;//用来判断有没有要消除的
	while (flag)
	{
		flag = false;//先假设没有了
		for (int i = 1;i <= n;i++)
		{
			for (int j = 1;j <= 10;j++)
			{
				if (g[i][j] != 0)
				{
					init();//数组重置
					num = 1;//错了一次才知道,自己也要算
					dfs(i,j,g[i][j]);
					if (num >= k)//如果连通块个数大于等于k
					{
						flag = true;//还有
						for (int p = 1;p <= n;p++)
						{
							for (int h = 1;h <= 10;h++)
							{
								if (f[p][h])
									g[p][h] = 0;
							}
						}
					}
				}
			}
		}
		if (flag)//如果有
			down();//下落
	}
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;j <= 10;j++)
			printf("%d", g[i][j]);
		printf("\n");
	}
    return 0;
}
2021/8/15 15:14
加载中...