- /*
- 来自网络。很精典。dfs的精典利用。什么时候我也能想出这样的算法呀,努力!!!!!
- */
- #include <stdio.h>
- bool canput(char map[5][5], int y, int x){ //判断能不能放塔
- if(map[y][x] != '.')return 0; //以经放塔或者为墙。不能放塔
- int i;
- for(i = y - 1; i >= 0; i--){
- if(map[i][x] == 'X')break; //有一堵墙
- if(map[i][x] == 'F')return 0; //以放塔
- }
- for(i = x - 1; i >= 0; i--){
- if(map[y][i] == 'X')break;
- if(map[y][i] == 'F')return 0;
- }
- return 1;
- }
- void dfs(char map[5][5], int n, int depth, int put, int &max){
- if(put > max)max = put;
- if(depth >= n*n) //递归调了n*n次?
- return;
- dfs(map,n,depth+1,put,max); //这是最原始的地图,没有放任何塔
- int y = depth / n, x = depth % n; //得到将要判断的点的x,y坐标
- if(canput(map,y,x)){
- map[y][x] = 'F';
- put++;
- dfs(map, n, depth+1, put, max); //这是放了塔后的地图
- map[y][x] = '.';
- put--;
- }
- }
- int main(){
- //freopen("input.txt","r",stdin);
- char map[5][5];
- int i,n,firenet;
- while(scanf("%d",&n)!=EOF && n){
- firenet = 0;
- for(i = 0; i < n; i++)scanf("%s",&map[i]);
- dfs(map,n,0,0,firenet);
- printf("%d/n",firenet);
- }
- return 0;
- }