有一个n行n列的地图,其中 '.' 代表空地,可以建造炮台,'x' 代表墙,建造规则是:每两个炮台之间必须有一堵墙,否者这两个炮台就会互相摧毁。现在输入一张这样的地图,要你计算最多可以建造多少炮台?
根据地图,得到一张新的数字地图,这张数字地图的构建方法是:
大小和原地图一样,
计算原地图的每一个 ' . ' 所在行列中有多少个 ‘ . ’,并将新图对应位置赋为该值。计算方法是:在每一行或每一列中走到底,或者遇到 ' x ' 结束。(可以包括本身也可以不包括本身,这里用不包括本身的方法)。
将原图中所有的 ' x ' 所在位置赋值为 无穷大(一个达不到的数即可,这里可以为 8 ,因为,最大为4行4列,这里计算又不包括本身,所以一个点所在的行列所有格子加起来最大也就是 6)。
按照这个方法可以得到一个新的地图:
在新图中贪心求解:(数字越小,证明在该点建造炮台影响到的点越少,可以建造的炮台也就越多)
找出第一排最小的数,判断是否小于 8 否 : 则下一行 。 是 :计数,然后将该点自己及其所影响到的不能再建造炮台的点赋值为无穷大。再找出最小的数,重复上述步骤,直到这一行没有小于8的数。
下一行:重复第一行的步骤,直到走完所有行结束。
#include
#include
#include
int main (){
char **str;
int **a,n,i,j,k,x,y,t,sum=0;
while(scanf("%d",&n)&&n){
getchar();
str=(char **)malloc(sizeof(char *)*n);//动态申请二维字符数组 str[][]; 用于存放字符地图
for(i=0;i=0&&str[k][j]=='.';k--)//上
t++;
for(k=i+1;k=0&&str[i][k]=='.';k--)//左
t++;
for(k=j+1;k=0&&a[k][y]!=8;k--) //上
a[k][y]=8;
for(k=x+1;k=0&&a[x][k]!=8;k--) //左
a[x][k]=8;
for(k=y+1;k