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;}