/* 来自网络。很精典。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; }