/*递归算法*/
#include <stdio.h> #include <string.h> #include <conio.h> int g[5][5], set[5][5]; int max, count, prei, prej; int n; int isok(int i, int j)
{ int k; for(k=i; k>0; k--) { if(set[k][j]) return 0; if(g[k][j]) break; } for(k=j; k>0; k--) { if(set[i][k]) return 0; if(g[i][k]) break; } return 1; } int hasnexti(int i, int j) //下一个坐标 { if(j == n) { if(i == n) return 0; else { return i+1; } } else { return i; } } void search(int i, int j) { int k; if(!g[i][j] && !set[i][j] && isok(i, j)) { set[i][j] = 1; count++; max = max > count ? max : count; search(i, j); set[i][j] = 0; count--; } if(!(k = hasnexti(i, j))) return; else { i = k; j = (j+1)%n ? (j+1)%n : n; if(!g[i][j] && !set[i][j] && isok(i, j)) { set[i][j] = 1; count++; max = max > count ? max : count; search(i, j); set[i][j] = 0; count--; } search(i, j); } }
int main() { int i, j; char c; freopen("in.txt", "r", stdin); while(scanf("%d", &n) && n) { memset(g, 0, sizeof(g)); for(i=1; i<=n; i++) { getchar(); for(j=1; j<=n; j++) { scanf("%c", &c); if(c == '.') g[i][j] = 0; else g[i][j] = 1; } } max = 0; count = 0; memset(set, 0, sizeof(set)); search(1, 1); printf("%d\n", max); } getch(); return 0; }
|