http://acm.hdu.edu.cn/showproblem.php?pid=1045
题目大意:
题目给出的依旧是二维数组模型的地图分布,或者说是“九宫格”形式,每一格可以设置为‘.’,也可以设置为‘X’,‘.’表示可行空道,‘X’表示墙,问在空带上最多可以设置多少个碉堡。其中碉堡的设置需满足两个碉堡不能同行不能同列,除非两两之间有墙相阻隔,求最大的安置碉堡数
分析:因为是在学贪心的时候做的此题,所以想到能不能贪心的方法去解这题。既然是贪心,应该每次将炮台放在能影响其他位置的最小的情况下,并且我们可以容易知道每一行炮台数必然大于或等于1.所以每次去找每一行最小的情况,将该位置能影响的位置做标记,循环进行;
#include<iostream>
using namespace std;
#include<cstring>
#include<cmath>
#include<algorithm>
char a[5][5];
int b[5][5];
int main()
{
int t,k,i,j;
while(cin>>t&&t){
for(i=0;i<t;i++)
for(int j=0;j<t;j++){
cin>>a[i][j];
}
//记录每一个空白能影响其他空白个数
memset(b,0,sizeof(b));
for(i=0;i<t;i++){
for(j=0;j<t;j++){
if(a[i][j]=='.'){
for(int n=j+1;n<t&&a[i][n]!='X';n++)
b[i][j]++;
for(int n=j-1;n>=0&&a[i][n]!='X';n--)
b[i][j]++;
for(int m=i+1;m<t&&a[m][j]!='X';m++)
b[i][j]++;
for(int m=i-1;m>=0&&a[m][j]!='X';m--)
b[i][j]++;
}
}
}
/* for(i=0;i<t;i++){
for(j=0;j<t;j++){
cout<<b[i][j]<<" ";
}
cout<<endl;
}*/
k=0;
int min1;
int x,y;
for(i=0; i<t; i++)
{
min1=8;
for(int j=0; j<t; j++) //每次都选这行的影响格子数最小的地方建立炮台
{
if(a[i][j]=='.'&&b[i][j]<min1)
{
min1=b[i][j];
x=i; //记录最小的位置
y=j;
}
}
b[x][y]=8; //将已经选择过的位置标记
if(min1!=8){
k++;
for(int n=x+1;n<t&&a[n][y]!='X';n++) //标记该位置能影响的点
b[n][y]=8;
for(int m=y+1;m<t&&a[x][m]!='X';m++)
b[x][m]=8;
i--; // 这里i是保证 每一行的每一个位置都被判断过,检漏
}
}
printf("%d\n",k);
}
return 0;
}