上链接:杭电1045
题目大意:
黑点为一个炮台,可以往四个方向射击,墙会挡住子弹,求输入的地图中能存在的炮台最大数
贴代码:
#include<cstdio>
using namespace std;
int n;
char map[5][5];
bool judge(int t[][5])
{
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
if(t[i][j]==0)
return false;
return true;
}
int dfs(int t[][5])
{
int i, j, l, c, maximum=0;
if(judge(t))
return 0;
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
{
if(t[i][j])
continue;
int tt[5][5];
for(l=1; l<=n; ++l)
for(c=1; c<=n; ++c)
tt[l][c]=t[l][c];
tt[i][j]=2;
for(l=i,c=j; t[l][c]!=1&&c<=n; ++c)
tt[l][c]=2;
for(l=i,c=j; t[l][c]!=1&&c>=1; --c)
tt[l][c]=2;
for(l=i,c=j; t[l][c]!=1&&l<=n; ++l)
tt[l][c]=2;
for(l=i,c=j; t[l][c]!=1&&l>=1; --l)
tt[l][c]=2;
int x=1+dfs(tt);
if(x>maximum)
maximum=x;
}
return maximum;
}
int main()
{
int i,j;
while(scanf("%d", &n)!=EOF && n)
{
getchar();
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
scanf("%c", &map[i][j]);
getchar();
}
int t[5][5];
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
t[i][j]=map[i][j]=='.'?0:1;
printf("%d\n", dfs(t));
}
return 0;
}