BFS,不解释。注意要从两个入口开始找!
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <deque>
#include <stack>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <time.h>
#include <string.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
#define LL long long
#define PI acos(-1.0)
#define N 301
#define MAX INT_MAX
#define MIN INT_MIN
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)
char c[40][40];
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node{
int x,y;
};
int sum;
int n;
bool vis[40][40];
void bfs(int x,int y){
queue<node> q;
node tmp;
tmp.x=x,tmp.y=y;
q.push(tmp);
while(!q.empty()){
tmp=q.front();
q.pop();
int xx,yy;
for(int i=0;i<4;i++){
xx=tmp.x+d[i][0];
yy=tmp.y+d[i][1];
if(xx<0 || yy<0 || xx>=n || yy>=n)
{sum++;continue;}
if(vis[xx][yy])continue;
if(c[xx][yy]=='#')
{sum++;continue;}
vis[xx][yy]=1;
node t;
t.x=xx,t.y=yy;
q.push(t);
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
int i,j;
for(i=0;i<n;i++)scanf("%s",c[i]);
sum=0;
memset(vis,0,sizeof(vis));
vis[0][0]=1;
bfs(0,0);
if(!vis[n-1][n-1]){
vis[n-1][n-1]=1;
bfs(n-1,n-1);
}//cout<<sum<<endl;
printf("%d\n",(sum-4)*9);
}
return 0;
}