题目大意:放置炮台,两个炮台在同行或者同列,则不能直接摆置,中间要有墙才能放置;
解题思路:用dfs找出每种摆置炮台的方法,记录最多炮塔数,本题的图规格比较小,所以dfs耗时不高。
/*HDU 1045 Fire Net*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
char gmap[4][4];
int maxNum=0;
int mx,m;
int canPut(int a,int b)
{
int i;
for(i=a;i>=0;i--)
{
if(gmap[i][b]=='b')return 0;
if(gmap[i][b]=='X')break;
}
for(i=b;i>=0;i--)
{
if(gmap[a][i]=='b')return 0;
if(gmap[a][i]=='X')break;
}
return 1;
}
void dfs(int n,int num)
{
int y=n%m;
int x=n/m;
if(n==m*m)
{
if(maxNum<=num)
{
maxNum=num;
return;
}
}
else
{
if(canPut(x,y)&&gmap[x][y]=='.')
{
gmap[x][y]='b';
dfs(n+1, num+1);
gmap[x][y]='.';
}
dfs(n+1, num);
}
}
int main(int argc, char *argv[])
{
while(cin>>m)
{
if(!m) break;
memset(gmap, '.', sizeof(gmap));//初始化gmap
for(int i=0; i<m; i++)
for(int j=0; j<m; j++)
{
cin>>gmap[i][j];
}
maxNum=0;
mx=0;
dfs(0, 0);
cout<<maxNum<<endl;
}
return 0;
}