思路:一行一行的搜索,如果当前为‘X' ,就搜下一个,如果当前为'.' ,判断能不能放一个装置,如果不能,直接搜索下一个,如果能,也要分两种情况,一种放,一种不放。
代码(有点长,但是好理解):
#include <cstdio>
#include <cstring>
char s[10][10];
int n;
int v[10][10];
int ans;
bool isLegal(int x,int y)
{
bool north = true;
bool south = true;
bool east = true;
bool west = true;
for(int i = x - 1; i >= 0 && s[i][y] != 'X'; --i)
if(v[i][y])
{
north = false;
break;
}
for(int i = x + 1; i < n && s[i][y] != 'X'; ++i)
if(v[i][y])
{
south = false;
break;
}
for(int i = y + 1; i < n && s[x][i] != 'X'; ++i)
if(v[x][i])
{
east = false;
break;
}
for(int i = y - 1; i >= 0 && s[x][i] != 'X'; --i)
if(v[x][i])
{
west = false;
break;
}
if(north && south && east && west)
return true;
return false;
}
void dfs(int x,int y,int sum)
{
if(x == n && y == 0)
{
if(sum > ans)
ans = sum;
return ;
}
if(s[x][y] == 'X')
{
if(y == n - 1)
dfs(x + 1,0,sum);
else
dfs(x,y + 1,sum);
}
if(s[x][y] == '.')
{
if(isLegal(x,y))
{
if(y == n - 1)
{
v[x][y] = 1;
dfs(x + 1,0,sum + 1); //放
v[x][y] = 0;
dfs(x + 1,0,sum); //不放
}
else
{
v[x][y] = 1;
dfs(x,y + 1,sum + 1); //放
v[x][y] = 0;
dfs(x,y + 1,sum); //不放
}
}
else
{
if(y == n - 1)
dfs(x + 1,0,sum);
else
dfs(x,y + 1,sum);
}
}
}
int main()
{
while(~scanf("%d",&n),n)
{
memset(v,0,sizeof(v));
for(int i = 0; i < n; ++i)
scanf("%s",s[i]);
ans = 0;
dfs(0,0,0);
printf("%d\n",ans);
}
return 0;
}