HDU 1045 Fire Net

该题我直接用的暴力搜索,因为之最大只有4*4,这个题最重要的是标记;

#include<stdio.h>
#include
<stdlib.h>
int max,map[6][6];
int flagx(int i,int j, int n)
{
int re=0;
for( int k=i;k<n;k++ )
{
if( map[k][j]=='X' )
break;
if( map[k][j]=='.' )
{
map[k][j]
=i;
re
++;
}
}
for( int k=i;k>=0;k-- )
{
if( map[k][j]=='X' )
break;
if( map[k][j]=='.' )
{
map[k][j]
=i;
re
++;
}
}
return re;
}
int flagx1(int i,int j ,int n)
{
int re=0;
for( int k=i;k<n;k++ )
{
if( map[k][j]=='X' )
break;
if( map[k][j]==i )
{
re
++;
map[k][j]
='.';
}
}
for( int k=i;k>=0;k-- )
{
if( map[k][j]=='X' )
break;
if( map[k][j]==i )
{
re
++;
map[k][j]
='.';
}
}
return re;
}
int flagy( int i,int j ,int n)
{
int re=0;
for( int k=j;k<n;k++ )
{
if( map[i][k]=='X' )
break;
if( map[i][k]=='.' )
{
map[i][k]
=i;
re
++;
}
}
for( int k=j;k>=0;k-- )
{
if( map[i][k]=='X' )
break;
if( map[i][k]=='.' )
{
map[i][k]
=i;
re
++;
}
}
return re;
}
int flagy1( int i,int j ,int n)
{
int re=0;
for( int k=j;k<n;k++ )
{
if( map[i][k]=='X' )
break;
if( map[i][k]==i )
{
map[i][k]
='.';
re
++;
}
}
for( int k=j;k>=0;k-- )
{
if( map[i][k]=='X' )
break;
if( map[i][k]==i )
{
map[i][k]
='.';
re
++;
}
}
return re;
}
void DFS( int count,int n,int sum )
{
if( sum==n*n )
{
if( max<count )
max
=count;
return ;
}
for( int i=0;i<n; i++ )
for( int j=0; j<n ; j++ )
{
if( map[i][j]=='.' )
{
sum
+=flagx( i,j,n );
sum
+=flagy( i,j ,n);
DFS(count
+1, n,sum );
sum
-=flagx1( i,j ,n);
sum
-=flagy1( i,j ,n);
}
}
}
int main()
{
int n;
while( scanf( "%d%*c",&n ),n )
{
int sum=0;
max
=0;
for( int i=0;i<n;i++ )
{
for( int j=0;j<n; j++ )
{
scanf(
"%c",&map[i][j] );
if( map[i][j]=='X' )
sum
++;
}
getchar();
}
DFS(
0, n,sum );
printf(
"%d\n",max );
}
return 0;
}
posted @ 2011-09-06 15:34  wutaoKeen  阅读(142)  评论(0编辑  收藏  举报