CodeForces 1105D Kilani and the Game (搜索bfs)

本文介绍了一种基于棋盘的多颜色扩散算法,通过队列和广度优先搜索(BFS)实现每种颜色按其扩散速度扩展到空白区域的过程。算法首先初始化棋盘状态,然后按顺序对每种颜色进行扩散,直到所有可涂色区域都被覆盖。关键步骤包括从边界向外扩展,计算最少步数以确定是否能扩展到更远,并使用变量记录剩余可涂色格子数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

一个棋盘,p种颜色已经涂了一些区域,每种颜色有扩散速度 si ,每轮按顺序依次扩展,扩展区域为已有区域任意格走 si 次能到达的可涂色格子,且不能穿过其他颜色与不可涂色格,棋盘无可涂色区域游戏结束,输出各种颜色格子数。

思路:

用队列按顺序bfs即可实现依次涂色,每次涂色要走最多si步,所以再嵌套一个bfs来从已有格子向外扩展。

要确保扩展的尽可能大,应从边界向外扩展,同时每次扩展计算最少步数判断是否能扩展到更远。

用一个变量记录剩余可涂色格子,0时直接跳出bfs。(本来tle,加了这个才勉强过去(´Д`))

代码:

(题目意思一直没理解清楚,边wa边改写的贼丑(lll¬ω¬)

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1020;
char mp[maxn][maxn];
bool vis[maxn][maxn];
int d[10][maxn][maxn];
int s[10],ans[10];
int n,m,p,last;
int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};
struct node{
	int x,y,o,s;		//o记录当前玩家,s记录剩余移动次数 
	node(){}
	node(int x,int y,int o,int s)
	{
		this->x = x;
		this->y = y;
		this->o = o;
		this->s = s;
	}
};
vector<node> bg[10];
queue<node> qn,qn2;
void bfs2()		//每格扩展的最大范围 
{

	while(!qn2.empty())
	{
		if(last == 0) return;
		node now = qn2.front(); qn2.pop();
		for(int i = 0; i < 4; i++)
		{
			int nx = now.x + dx[i];
			int ny = now.y + dy[i];
			if(nx < 0 || nx >= n || ny < 0 || ny >=m) continue;
			else 
			{
				if(!vis[nx][ny])
				{
					ans[now.o]++;
					vis[nx][ny] = true;
					mp[nx][ny] = '0' + now.o;
					d[now.o][nx][ny] = d[now.o][now.x][now.y] + 1;
					node next(nx,ny,now.o,now.s-1);
					if(d[now.o][nx][ny] % s[now.o] == 0) qn.push(next);
					if(now.s > 1) qn2.push(next);
					last--;
				}
				else if(mp[nx][ny] != '0' + now.o) continue;
				else if(d[now.o][now.x][now.y] + 1 < d[now.o][nx][ny])	//从当前格过来步数更少能扩展到更远 
				{
					node next(nx,ny,now.o,now.s-1);
					d[now.o][nx][ny] = d[now.o][now.x][now.y] + 1;
					if(now.s > 1) qn2.push(next);
				}
			}
		}
	}
}
void bfs()		//按顺序扩展 
{
	while(!qn.empty())
	{
		node now = qn.front(); qn.pop();
		node temp(now.x,now.y,now.o,s[now.o]);
		while(!qn2.empty()) qn2.pop();
		qn2.push(temp);
		bfs2();
	}
}
int main()
{
	scanf("%d%d%d",&n,&m,&p);
	last = n * m;
	for(int i = 1; i <= p; i++) scanf("%d",&s[i]);
	for(int i = 0; i < n; i++) scanf("%s",mp[i]);
	
	for(int i = 0 ; i < 10; i++) bg[i].clear();
	memset(ans,0,sizeof(ans));
	memset(vis,0,sizeof(vis));
	memset(d,0x33,sizeof(d));

	for(int i = 0; i < n; i++)
	{	
		for(int j = 0; j < m; j++)
		{
			if(mp[i][j] != '.')
			{
				if(mp[i][j] != '#')
				{
					int t = mp[i][j] - '0';
					ans[t]++;
					d[t][i][j] = 0;
					bg[t].push_back(node(i,j,t,s[t]));
				}
				vis[i][j] = true;
				last--;
			}
		}
	}
	while(!qn.empty()) qn.pop();
	for(int i = 1; i <= p; i++) 
		for(int j = 0; j < bg[i].size(); j++) qn.push(bg[i][j]);	//按顺序加入棋盘上的已有城堡	
	bfs();
	
	for(int i = 1; i <= p; i++) printf("%d ",ans[i]);
	printf("\n");
}

 

内容概要:《中文大模型基准测评2025年上半年报告》由SuperCLUE团队发布,详细评估了2025年上半年中文大模型的发展状况。报告涵盖了大模型的关键进展、国内外大模型全景图及差距、专项测评基准介绍等。通过SuperCLUE基准,对45个国内外代表性大模型进行了六大任务(数学推理、科学推理、代码生成、智能体Agent、精确指令遵循、幻觉控制)的综合测评。结果显示,海外模型如o3、o4-mini(high)在推理任务上表现突出,而国内模型如Doubao-Seed-1.6-thinking-250715在智能体Agent和幻觉控制任务上表现出色。此外,报告还分析了模型性价比、效能区间分布,并对代表性模型如Doubao-Seed-1.6-thinking-250715、DeepSeek-R1-0528、GLM-4.5等进行了详细介绍。整体来看,国内大模型在特定任务上已接近国际顶尖水平,但在综合推理能力上仍有提升空间。 适用人群:对大模型技术感兴趣的科研人员、工程师、产品经理及投资者。 使用场景及目标:①了解2025年上半年中文大模型的发展现状与趋势;②评估国内外大模型在不同任务上的表现差异;③为技术选型和性能优化提供参考依据。 其他说明:报告提供了详细的测评方法、评分标准及结果分析,确保评估的科学性和公正性。此外,SuperCLUE团队还发布了多个专项测评基准,涵盖多模态、文本、推理等多个领域,为业界提供全面的测评服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值