//没有X的位置均可以放置,我们先统计能够放置的个数,比如为n,则2的n次方-1为能够放置的最大整数
//将整数转换为2进制放入格子中,判断是否满足条件,保存一个最大值
//2868598 2012-04-19 23:30:28 Accepted 1002 C++ 10 180 chg zoj 1002 枚举
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
int ma[4][4];
int matmp[4][4];
int digit;
int n;
int all[16];
//put in number
int putin(int num)
{
int res=0;
int count=digit;
count--;
while(num!=0){
if(num%2==1){
res++;
}
all[count--]=num%2;
num=num/2;
}
int k=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(matmp[i][j]==0){
matmp[i][j]=all[k++];
}
}
return res;
}
void back(){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
matmp[i][j]=ma[i][j];
}
}
bool canPlace(int row,int col){
int rowtmp=row;
while(rowtmp>=0){
rowtmp--;
if(rowtmp<0)
break;
if(matmp[rowtmp][col]==2)
break;
else if(matmp[rowtmp][col]==1)
return false;
}
rowtmp=row;
while(rowtmp<n){
rowtmp++;
if(rowtmp>=n)
break;
if(matmp[rowtmp][col]==2)
break;
else if(matmp[rowtmp][col]==1)
return false;
}
int coltmp=col;
while(coltmp>=0){
coltmp--;
if(coltmp<0)
break;
if(matmp[row][coltmp]==2)
break;
else if(matmp[row][coltmp]==1)
return false;
}
coltmp=col;
while(coltmp<n){
coltmp++;
if(coltmp>=n)
break;
if(matmp[row][coltmp]==2)
break;
else if(matmp[row][coltmp]==1)
return false;
}
return true;
}
int main()
{
while(scanf("%d",&n)&&n)
{
getchar();
digit=0;
char tmp;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%c",&tmp);
if(tmp=='.'){
digit++;
ma[i][j]=0;
matmp[i][j]=0;
}
else{
ma[i][j]=2;
matmp[i][j]=2;
}
}
getchar();
}
//===============================================================
int max=0;
bool flag;
for(int i=0;i<=(1<<digit)-1;i++){
memset(all,0,sizeof(all));
int tmpRes=putin(i);
flag=false;
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(matmp[j][k]==1)
{
if(!canPlace(j,k)){
flag=true;
break;
}
}
}
if(flag)
break;
}
if(flag==false&&max<tmpRes){
max=tmpRes;
}
back();
}
printf("%d\n",max);
}
return 0;
}
Fire Net
最新推荐文章于 2013-03-11 13:00:54 发布