这题数据比较水, 直接暴力地挨个儿地判断每一个点,就可以过掉了。。。。。。。(看到有人用二分图什么的,我还不会....努力学习中`
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int maxn = 5;
char G[maxn][maxn];
int h, ans;
bool jg(int x, int y) {
for(int i = x-1; i >= 0; i--) { //行向上判断
if(G[i][y] == '#') return false;
if(G[i][y] == 'X') break;
}
for(int i = y-1; i >= 0; i--) { //列向左判断
if(G[x][i] == '#') return false;
if(G[x][i] == 'X') break;
}
return true;
}
void dfs(int cur, int num) {
if(cur > h*h) {
ans = max(ans, num);
return ;
}
int x = (cur-1)/h;
int y = (cur-1)%h;
if(G[x][y] == '.' && jg(x, y)) {
G[x][y] = '#';
dfs(cur+1, num+1);
G[x][y] = '.';
}
dfs(cur+1, num);
}
/*
void dfs(int cur, int num) {
if(判断到最后一个点了) {
更新最大可填的点的数目
return ;
}
int x = (cur-1)/h;
int y = (cur-1)%h;
if(可以填并且填上||可以填但是不填)
else(不可以填)
}
*/
int main() {
while(~scanf("%d", &h) && h) {
ans = 0;
for(int i = 0; i < h; i++) {
scanf("%s", G[i]);
}
dfs(1, 0);
cout << ans << endl;
}
return 0;
}