城堡 The Castle(uscao)

题目传送门sxazr
本体真的是因为细节问题花费了我将近两个小时的光阴啊
认真,仔细!
找连通块,每找完一个连通块把连通块内的每个方格标记上该连通块的序号,
( 在后面拆墙时判断是否在一个连通块里)记录最大的连通块;
枚举每个方格,拆墙(这里只枚举上面的墙和左面的墙就可以),记录最好的拆墙位置;
注意多解时选择输出那个;
输出有多少个连通块;
代码

#include <iostream>
#include <cstdio>
using namespace std;
const int N=52;
int m,n,f[N][N],q[N][N],r1,r2,v[10001],num;//v表示连通块的大小
int st1[2501],st2[2501],top;
int max1,max2,h,l,g;
bool wal[N][N][N][N];
int o[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void ad(int x,int y,int k)    //建墙
{
	if(k>=8){
		wal[x][y][x+1][y]=1;
		k-=8;
	}
	if(k>=4){
		wal[x][y][x][y+1]=1;
		k-=4;
	}
	if(k>=2){
		wal[x][y][x-1][y]=1;
		k-=2;
	}
	if(k>=1) wal[x][y][x][y-1]=1;
	return;
}
void zr(int x,int y)//找连通块
{
	q[x][y]=1;
	st1[++top]=x;st2[top]=y;
	for(int i=0;i<4;i++){
		int a=x+o[i][0],b=y+o[i][1];
		if(a<1||b<1||a>n||b>m) continue;
		if(wal[x][y][a][b]||q[a][b]) continue;
		zr(a,b);
	}
	if(x==r1&&y==r2){
		num++;v[num]=top;max1=max(max1,top);
		while(top) f[st1[top]][st2[top]]=num,top--; 连通块内的做标记
	}
	return;
}
int main()
{
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=m;j++){
	 	int x;
	 	scanf("%d",&x);
	 	ad(i,j,x);
	  }
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=m;j++){
	  	if(f[i][j]||q[i][j]) continue;
	  	top=0;
	  	r1=i;r2=j;
	  	zr(i,j);
	  }
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=m;j++)
	  	for(int k=0;k<2;k++){
	  		int x=i+o[k][0],y=j+o[k][1];
	  		if(x<1||y<1||x>n||y>m) continue;
	  		if(!wal[i][j][x][y]||f[i][j]==f[x][y]) continue;
	  		if(v[f[i][j]]+v[f[x][y]]>max2){
	  			max2=v[f[i][j]]+v[f[x][y]];
	  			h=i;l=j;g=k;
			  }
			else if(v[f[i][j]]+v[f[x][y]]==max2){
				if(j>l) continue;
				if(i==h&&j==l) continue; //多解
				h=i;l=j;g=k;
			}
		}
	printf("%d\n%d\n%d\n%d %d ",num,max1,max2,h,l);
	if(g==0) cout<<"N";
	else cout<<"E";
	return 0;
}
关于“Stop the Castle IT context”,从网络上的资料来看,这可能涉及一款名为《Stop the Castle》的游戏或应用程序。以下是相关信息的整理和解答: --- ### 关于《Stop the Castle》的基本介绍 《Stop the Castle》是一款策略类游戏,玩家需要阻止敌方建造城堡或防御工事。该游戏通常结合了塔防元素和其他战略玩法,适合喜欢挑战性的游戏玩家。 --- ### 游戏的技术背景(IT Context) 对于开发者而言,《Stop the Castle》可能会涉及到以下技术和开发领域: #### 1. 游戏引擎选择 大多数现代游戏会使用Unity或Unreal Engine等流行的游戏引擎进行开发。例如,在Unity中可以利用C#编写逻辑代码,而Unreal则支持Blueprints视觉脚本系统以及C++编程语言。 ```csharp // 示例:简单的敌人移动逻辑 (适用于 Unity) void Update() { transform.Translate(Vector3.forward * Time.deltaTime); } ``` #### 2. 图形渲染与优化 为了确保流畅运行,特别是针对手机设备的应用版本,图形渲染是一个关键点。开发者可以通过降低多边形数量、减少纹理分辨率等方式提升性能。此外,LOD(Level of Detail)技术也可以用于动态调整模型细节级别。 #### 3. 数据存储与进度管理 保存玩家进度通常是通过本地文件或者云端数据库完成。SQLite是一种轻量级的关系型数据库管理系统,非常适合小型项目;而对于跨平台同步需求,则可以选择Firebase这样的云服务平台。 --- ### 开发者资源推荐 如果计划创建类似风格的作品,可以从以下几个方面入手准备素材和技术积累: - **美术资产**:寻找免费或付费的像素艺术包,比如Kenney.nl提供了大量开源资源供独立开发者下载使用。 - **音效设计**:Freesound.org上有许多高质量的声音片段可供挑选,帮助构建沉浸式体验环境。 - **学习教程**:YouTube上有很多专注于特定技能的教学视频,例如如何制作基础AI路径规划算法等等。 --- ### 注意事项 如果是寻求技术支持而非单纯了解产品概况的话,请提供更多上下文线索以便更精准定位问题所在范围。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值