FIRENET,此题也应该算是一道经典题。
此题数据范围小,不需要剪枝——其实我不知道怎么剪枝,貌似没什么可剪的。
/*
* hdu-1045
* mike-w
* 2012-4-8
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 10
#define NDISP_MAP
char map[MAX_SIZE][MAX_SIZE];
int d[4][2]={0,1,0,-1,1,0,-1,0};
int N,cnt;
int ok(int x, int y)
{
if(map[x][y]!='.')
return 0;
int i,xx,yy;
for(i=0;i<4;i++)
{
xx=x+d[i][0];
yy=y+d[i][1];
while(xx>=0 && xx<N && yy>=0 && yy<N && map[xx][yy]!='X')
{
if(map[xx][yy]=='o')
return 0;
xx+=d[i][0];
yy+=d[i][1];
}
}
return 1;
}
#ifdef DISP_MAP
int disp_map(void)
{
int i;
puts("-------------------");
for(i=0;i<N;i++)
puts(map[i]);
return 0;
}
#endif
int search(int x, int y, int c)
{
int i,j;
for(j=y;j<N;j++)
if(ok(x,j))
{
map[x][j]='o';
#ifdef DISP_MAP
disp_map();
#endif
search(x,j+1,c+1);
map[x][j]='.';
}
for(i=x+1;i<N;i++)
for(j=0;j<N;j++)
if(ok(i,j))
{
map[i][j]='o';
#ifdef DISP_MAP
disp_map();
#endif
search(i,j+1,c+1);
map[i][j]='.';
}
if(c>cnt)
cnt=c;
return 0;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i;
while(scanf("%d",&N),N)
{
for(i=0;i<N;i++)
scanf("%s",map[i]);
cnt=0;
search(0,0,0);
printf("%d\n",cnt);
}
return 0;
}