#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);
}
}
Hdu1045 - Fire Net - 贪心算法
最新推荐文章于 2019-08-31 10:11:00 发布