题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1017
非常简单的回溯,没有用任何的限界函数就可以AC。代码如下:
- #include <cstdio>
- int n;
- char m[5][5];
- int ans, cn;
- bool ok(int i, int j) {
- if(m[i][j] == 'X')
- return false;
- for(int t = j-1; t >= 1 && m[i][t] != 'X'; t--) {
- if(m[i][t] == '*')
- return false;
- }
- for(int t = i-1; t >= 1 && m[t][j] != 'X'; t--) {
- if(m[t][j] == '*')
- return false;
- }
- return true;
- }
- void backtrack(int i, int j) {
- if(i > n) {
- if(cn > ans) {
- ans = cn;
- }
- return;
- }
- if(ok(i, j)) {
- m[i][j] = '*';
- cn++;
- if(j >= n) {
- backtrack(i+1,1);
- } else {
- backtrack(i, j+1);
- }
- m[i][j] = '.';
- cn--;
- }
- if(j >= n) {
- backtrack(i+1, 1);
- } else {
- backtrack(i, j+1);
- }
- }
- int main() {
- freopen("in.txt", "r", stdin);
- while(scanf("%d", &n), n) {
- for(int i = 1; i <= n; i++) {
- scanf("%s", &m[i][1]);
- }
- ans = 0;
- cn = 0;
- backtrack(1,1);
- printf("%d/n", ans);
- }
- return 0;
- }