Hdu1045 - Fire Net - 贪心算法

本文探讨了在有限地形上最优放置碉堡的算法策略,通过定义地图、标记规则及评估函数,实现了按照地形限制最小化的高效放置方案。

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

#include<stdio.h>
#include<algorithm>
using namespace std;
char map[5][5];//地图
int mark[5][5];//标记
int t;
struct Po
{
	int x,y,tot;
}po[25];
int point(int m,int n)//当前点有多少个不可以放碉堡的点
{
	int up,down,left,right,num=1;
	for(up=m-1;up>=0;up--)
	{
		if(map[up][n]=='X')
		{
			break;
		}
		else num++;
	}
	for(down=m+1;down<t;down++)
	{
		if(map[down][n]=='X')
		{
			break;
		}
		else num++;
	}
	for(left=n-1;left>=0;left--)
	{
		if(map[m][left]=='X')
		{
			break;
		}
		else num++;
	}
	for(right=n+1;right<t;right++)
	{
		if(map[m][right]=='X')
		{
			break;
		}
		else num++;
	}
	return num;
}
int cmp(Po a,Po b)
{
	return a.tot<b.tot;
}
void markpoint(int m,int n)//标记不能放碉堡的点
{  
	int up,down,left,right;
	mark[m][n]=1;  
	for(up=m-1;up>=0;up--)  
	{  
		if(map[up][n]=='X')
		{
			break;
		}
		mark[up][n]=1;  
	}  
	for(down=m+1;down<t;down++)  
	{  
		if(map[down][n]=='X')
		{
			break;
		}
		mark[down][n]=1;  
	}  
	for(int left=n-1;left>=0;left--)  
	{  
		if(map[m][left]=='X')
		{
			break;
		}
		mark[m][left]=1;  
	}  
	for(int right=n+1;right<t;right++)  
	{  
		if(map[m][right]=='X')
		{
			break;
		}
		mark[m][right]=1;  
	}  
}  
int main()
{
	int i,j,k;
	int count;
	while(scanf("%d",&t)!=EOF)
	{
		if(t==0)
		{
			break;
		}
		count=0;
		for(i=0;i<t;i++)
		{
			scanf("%s",map[i]);
		}
		memset(mark,0,sizeof(mark));
		k=0;
		for(i=0;i<t;i++)
		{
			for(j=0;j<t;j++)
			{
				if(map[i][j]!='X')
				{
					po[k].tot=point(i,j);//记录当前点可以标记多少个点
					po[k].x=i;//记录行坐标
					po[k].y=j;//记录列坐标
					k++;//点数+1
				}
			}
		}
		sort(po,po+k,cmp);//按照标记周围点数从小到大排,这样一定是最优解
		for(i=0;i<k;i++)
		{
			if(mark[po[i].x][po[i].y]==0)//如果当前点没被标记过
			{
				count++;//点数+1
				markpoint(po[i].x,po[i].y);//标记周围的点
			}
		}
		printf("%d\n",count);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值