建造城堡,城堡不能在同一行或同一列,如果在同一行或同一列必须被城墙’X‘隔开,问最多可以建造的城堡数。
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
char str[10][10];
int n, cut, ans;
int ok( int x, int y )
{
for( int i=x-1;i>=0;i-- )
{
if( str[i][y]=='*' )
return 0;
else if( str[i][y]=='X' )
break;
}
for( int i=y-1;i>=0;i-- )
{
if( str[x][i]=='*' )
return 0;
else if( str[x][i]=='X' )
break;
}
return 1;
}
void dfs( int k, int cut )
{
if( k==n*n )
{
ans=max( ans, cut );
return ;
}
else
{
int x=k/n;
int y=k%n;
if( str[x][y]=='.' && ok( x, y ) )
{
str[x][y]='*';
dfs( k+1, cut+1 );
str[x][y]='.';
}
dfs( k+1, cut );
}
}
int main()
{
int i, j, k;
while( scanf( "%d", &n ), n )
{
for( i=0;i<n;i++ )
scanf( "%s", str[i] );
cut=ans=0;
dfs( 0, 0 );// 第一个数表示位置,第二个表示已经建造的城堡数目
printf( "%d\n", ans );
}
return 0;
}