题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2
解题报告:
这里的深搜有一点不同,就是,在深搜每一个点时,都要深搜每一个点,就是一个完全二叉树。
借鉴:http://blog.csdn.net/zxy_snow/article/details/5952668
#include <stdio.h> #include <iostream> #include <stdlib.h> using namespace std; int visit[10][10],mmax,n,cou; ///visit 里面为0,表示没有东西,1表示有碉堡,2表示有墙; ///cou,计数当下放的碉堡个数 ///mmax,表示最佳方案 int canPut(int x,int y)///计算是否可以放碉堡 { ///有碉堡,则返回0 for(int i=y;i>=1;i--) { if(visit[x][i]==1) return 0; if(visit[x][i]==2) break; } for(int i=y;i<=n;i++) { if(visit[x][i]==1) return 0; if(visit[x][i]==2) break; } for(int i=x;i>=1;i--) { if(visit[i][y]==1) return 0; if(visit[i][y]==2) break; } for(int i=x;i<=n;i++) { if(visit[i][y]==1) return 0; if(visit[i][y]==2) break; } return 1; } ///DFS void dfs() { if(cou>mmax) mmax=cou; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(!visit[i][j]&&canPut(i,j)) { visit[i][j]=1; cou++; dfs(); visit[i][j]=0; cou--; } } } } int main() { char str[10]; while(scanf("%d",&n),n) { mmax=0,cou=0; for(int i=1;i<=n;i++) { cin>>str; for(int j=0;j<n;j++) { visit[i][j+1]=(str[j]=='X')?2:0; } } dfs(); cout<<mmax<<endl; } return 0; }