ACM--贪心--hdoj1045

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40725780/article/details/81236687