您的位置:首页 > 其它

HDU 1045 Fire Net

2011-09-06 15:34 337 查看
该题我直接用的暴力搜索,因为之最大只有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: