思路
这道题其实是一道很经典的二分图匹配问题,在我看了后准备放弃的时候,发现这道题的数据量最大是 4 ,所以这就给我们暴搜提供了可能。
最多只有16个方块,所以直接从第一个开始枚举,以后的每一步都分两种情况,放和不放,在最后出界的时候记录一下最大值就行了。
具体实现见代码
代码
#include <cstdio>
#include <algorithm>
using namespace std;
int n, ans;
char map[5][6];
bool judge(int x, int y)
{
// 由于是从第一块开始枚举,所以后面的都没有放堡垒,直接查看左边和上边是否满足即可
for(int i=x; i>0&&map[i][y]!='X'; i--) if(map[i][y]=='B') return false;
for(int j=y; j>0&&map[x][j]!='X'; j--) if(map[x][j]=='B') return false;
return true;
}
void dfs(int x, int y, int bh)
{
if(y>n)
{
// 一行查完,进入下一行
if(x<n) y = 1, x++;
else
{
// 出界,记录答案
ans = max(ans, bh);
return;
}
}
if(map[x][y]=='.' && judge(x, y))
{
map[x][y] = 'B';
// 放
dfs(x, y+1, bh+1);
map[x][y] = '.';
}
// 不放
dfs(x, y+1, bh);
}
int main()
{
while(scanf("%d", &n)&&n)
{
for(int i=1; i<=n; i++)
scanf("%s", map[i]+1);
ans = 0;
dfs(1, 1, 0);
printf("%d\n", ans);
}
return 0;
}