題目: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;}