Problem:
Score: 400 points

Problem statement

We have an H \times W grid whose squares are painted black or white. The square at the i-th row from the top and the j-th column from the left is denoted as (i, j).

Snuke would like to play the following game on this grid. At the beginning of the game, there is a character called Kenus at square (1, 1). The player repeatedly moves Kenus up, down, left or right by one square. The game is completed when Kenus reaches square (H, W) passing only white squares.

Before Snuke starts the game, he can change the color of some of the white squares to black. However, he cannot change the color of square (1, 1) and (H, W). Also, changes of color must all be carried out before the beginning of the game.

When the game is completed, Snuke's score will be the number of times he changed the color of a square before the beginning of the game. Find the maximum possible score that Snuke can achieve, or print -1 if the game cannot be completed, that is, Kenus can never reach square (H, W) regardless of how Snuke changes the color of the squares.

The color of the squares are given to you as characters s_{i, j}. If square (i, j) is initially painted by white, s_{i, j} is .; if square (i, j) is initially painted by black, s_{i, j} is #.

Constraints

H is an integer between 2 and 50 (inclusive).

W is an integer between 2 and 50 (inclusive).

s_{i, j} is . or # (1 \leq i \leq H, 1 \leq j \leq W).

s_{1, 1} and s_{H, W} are ..

Input

Input is given from Standard Input in the following format:

H W
s_{1, 1}s_{1, 2}s_{1, 3} ... s_{1, W}
s_{2, 1}s_{2, 2}s_{2, 3} ... s_{2, W}
: :
s_{H, 1}s_{H, 2}s_{H, 3} ... s_{H, W}

Output

Print the maximum possible score that Snuke can achieve, or print -1 if the game cannot be completed.

Sample Input 1

3 3
..#
#..
...

Sample Output 1

2

The score 2 can be achieved by changing the color of squares as follows:

Sample Input 2

10 37
.....................................
...#...####...####..###...###...###..
..#.#..#...#.##....#...#.#...#.#...#.
..#.#..#...#.#.....#...#.#...#.#...#.
.#...#.#..##.#.....#...#.#.###.#.###.
.#####.####..#.....#...#..##....##...
.#...#.#...#.#.....#...#.#...#.#...#.
.#...#.#...#.##....#...#.#...#.#...#.
.#...#.####...####..###...###...###..
.....................................

Sample Output 2

209

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000

/*
题意大致是:有一个方形的格子区域,现在要从左上角的方块走到右下角的方块.(左上右下一定是白色格子)
格子有黑有白,但是只能走白色格子,现在要找一条最短通路,然后其他的格子都可以被涂成黑色.
这个题的问题就是:最多能把多少块白色格子变成黑色的.如果不能,输出-1.
这个题的思路很简单易懂:求出一个最短的白色格子通路,然后结果就等于总格子数-黑色格子数-通路长度. 
但是一个关键问题摆出来了:怎么确定所求的路径就是最短通路呢?
我的想法:优先右下,其次左上. 
*/ 

int count=0;
int square[MAX][MAX];//油区二维数组 
int visited[MAX][MAX];//标记这个点是否被判断过 
int direct[8][2]={{1,0},{0,1},{-1,0},{0,-1}};
//标记了四个方位:下,右,上,左 

int DFSearch(int row,int column,int ROW,int COL)
{
	visited[ROW][COL]=1;//当前节点已被经过
	if(ROW==row-1 && COL==column-1)
	{
		return count;
	}
	for(int i=0;i<4;i++)
	{
		int x=ROW+direct[i][0];//横向移动 
		int y=COL+direct[i][1];//纵向移动
		if(x>=0 && x<=row-1 && y>=0 && y<=column-1 && visited[x][y]==0 && square[x][y]=='.')
		//判断标准是比较严苛的:首先,更新后的坐标点位置不能越界,其次,这个点不能已经被访问,还有必须是白色格子. 
		{
			count++;
			DFSearch(row,column,x,y);
		} 
		else if(x==row-1 && y==column-1)
		{
			return count;
		} 
	}
}

int main()
{
	int row,column;
	int number;
	int black;
	while(scanf("%d%d",&row,&column)!=EOF)
	{
		number=0;
		black=0;
		getchar();//吸收回车键 
		for(int i=0;i<row;i++)
		{
			for(int j=0;j<column;j++)
			{ 
				scanf("%c",&square[i][j]);
			}
			getchar();//吸收回车键
		}//输入字符数组(二维)
		for(int i=0;i<MAX;i++)
		{
			for(int j=0;j<MAX;j++)
			{
				visited[i][j]=0;//所有节点都未被经过 
			}
		}//访问结点初始化
		for(int i=0;i<row;i++)
		{
			for(int j=0;j<column;j++)
			{
				if(square[i][j]=='#')
				{
					black++;
				}
			}
		}
		number=row*column-black-DFSearch(row,column,0,0);
		printf("%d\n",number);
	}
	return 0;
}