题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[5][5], w[5][5];
int n, ans;
bool check(int r, int c)
{
int i;
if(w[r][c] == 1) return false;
for(i = r - 1; i >= 0; i--)
{
if(a[i][c] == 1) return false;
if(w[i][c] == 1) break;
}
for(i = r + 1; i < n; i++)
{
if(a[i][c] == 1) return false;
if(w[i][c] == 1) break;
}
for(i = c - 1; i >= 0; i--)
{
if(a[r][i] == 1) return false;
if(w[r][i] == 1) break;
}
for(i = c + 1; i < n; i++)
{
if(a[r][i] == 1) return false;
if(w[r][i] == 1) break;
}
return true;
}
void dfs(int index, int cnt)
{
if(index == n * n)
{
ans = max(ans, cnt);
return;
}
if(ans > n * n - index + cnt) return;
int r = index / n;
int c = index % n;
if(check(r, c))
{
a[r][c] = 1;
dfs(index + 1, cnt + 1);
a[r][c] = 0;
dfs(index + 1, cnt);
return;
}
dfs(index + 1, cnt);
}
int main()
{
while(scanf("%d",&n))
{
if(n == 0) break;
memset(a, 0, sizeof(a));
memset(w, 0, sizeof(w));
char str[10];
for(int i = 0; i < n; i++)
{
scanf("%s",str);
for(int j = 0; j < n; j++)
if(str[j] == 'X')
w[i][j] = 1;
}
ans = 0;
dfs(0, 0);
printf("%d\n",ans);
}
return 0;
}