/*讌襤磯悪*/
/*
1. 讌襤磯悪 蠍磯ゼ 
2. 讌襤磯 '*' 襦 螻, 讌襤郁  蟆 '.'朱 .
3. レ 覃 讌襤郁  螻褐 豢ロ.
4. 讌襤磯悪 0, 0企 譬襭.
5. C++豐覲伎 殊螳 襦蠏碁 讌蟆企 ..覲願 讌 蟆 る 讌 譯朱 譬蟆..
*/


/* 蟆郁骸

讌襤磯悪 : X, Y豢 ロ.
X豢: 4
Y豢: 4
讌襤磯ゼ ロ. (讌襤: *, 讌襤郁 蟆: .)
*...
....
.*..
....

Field #1
* 1 0 0
2 2 1 0
1 * 1 0
1 1 1 0

讌襤磯悪 : X, Y豢 ロ.
X豢: 3
Y豢: 3
讌襤磯ゼ ロ. (讌襤: *, 讌襤郁 蟆: .)
***
*.*
***

Field #2
* * *
* 8 *
* * *

讌襤磯悪 : X, Y豢 ロ.
X豢: 0
Y豢: 0
覓危る 襯企 譬襭.

*/

#include "stdafx.h"
#include <iostream>
#include <string>
#define Y_SIZE 100

using namespace std;


//螳  讌襤 
class CCreateMine	
{
private:
	char* pX;

public:
	CCreateMine(int x);
	~CCreateMine();
	void InputMineX(int x);
	char OutputMineX(int x);
};

//讌襤 
CCreateMine::CCreateMine(int x)
{
	pX = new char[x];
}

//覃語
CCreateMine::~CCreateMine()
{
	delete pX;
}

//讌襤一
void CCreateMine::InputMineX(int x)
{
	for(int i = 0; i < x; i++)
	{
		cin >> pX[i];
	}
}

//讌襤一
char CCreateMine::OutputMineX(int x)
{
	return pX[x];
}

//螳 襦磯ゼ ロ 企
class CRowStorage
{
private:
	int x;
	int y;
	CCreateMine* pArray[Y_SIZE];	//Y_SIZE 100
public:
	CRowStorage();
	void InputXY();
	void InputMineY();
	void OutputMineY();
	int returnX();
	int returnY();
};

CRowStorage::CRowStorage()
{
	x = 0;
	y = 0;
}

//讌襤磯悪 X, Y 
void CRowStorage::InputXY()
{
	cout << "讌襤磯悪 : X, Y豢 ロ." << endl;
	cout << "X豢: ";
	cin >> x;
	cout << "Y豢: ";
	cin >> y;

	if(x > 0 && y > 0)
		cout << "讌襤磯ゼ ロ. (讌襤: *, 讌襤郁 蟆: .)" << endl;
	else
		return;
}

//螳 襦磯襦 讌襤磯ゼ ル.
void CRowStorage::InputMineY()
{
	if(x > 0 && y > 0 && y <= Y_SIZE)	//Y_SIZE 100
	{
		for(int i = 0; i < y; i++)
		{
			pArray[i] = new CCreateMine(x);
			pArray[i]->InputMineX(y);
		}
		cout << endl;
		
	}
	else
	{
		cout << "讌襤磯悪 X, Y 覿 ロ伎 ." << endl;
		CRowStorage::InputXY();
	}
}


//讌襤一
//讌襤一企 * 覃 ,  -> [i+1], 譬,  -> [i-1]
void CRowStorage::OutputMineY()
{
	int num = 0;

	if(x > 1 && y > 1 && y <= Y_SIZE)	//Y_SIZE 100
	{
		for(int i = 0; i < y; i++)
		{
			for(int j = 0; j < x; j++)
			{
				char ch = pArray[i]->OutputMineX(j);

				if(ch != '*')	//讌襤郁 覃 譯朱 讌襤郁 讌 
				{
					for(int i2 = i - 1; i2 <= i + 1; i2++)
					{
						for(int j2 = j - 1; j2 <= j + 1; j2++)
						{
							if(i2 >= 0 && i2 < y)
							{
								if(j2 >= 0 && j2 < x)
								{
									if(pArray[i2]->OutputMineX(j2) == '*')
										num++;
								}
							}
						}
					}
					cout << num << " ";
				}
				else			//讌襤一企
				{
					cout << "*" << " ";
				}

				num = 0;

				if(j == x - 1)
						cout << endl;
			}
		}
	}
	else
	{
		cout << "讌襤磯悪 X, Y襯 (x, y 覈 1 伎)伎 ." << endl;
		CRowStorage::InputXY();
	}
}

int CRowStorage::returnX()
{
	return x;
}

int CRowStorage::returnY()
{
	return y;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 1;
	CRowStorage* rs = new CRowStorage();

	do
	{
		rs->InputXY();
		
		if(rs->returnX() > 0 && rs->returnY() > 0)
		{
			rs->InputMineY();
			cout << "Field #" << i << endl;
			rs->OutputMineY();
			cout << endl;
		}
		i++;
		
	}while(rs->returnX() > 0 || rs->returnY() > 0);
	
	delete rs;

	cout << "覓危る 襯企 譬襭.";
	cin.ignore(i);
	cout << endl;

	return 0;
}