問(wèn)題描述
有一間長(zhǎng)方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動(dòng)。請(qǐng)寫一個(gè)程序,計(jì)算你總共能夠到達(dá)多少塊黑色的瓷磚。
輸入
包括多個(gè)數(shù)據(jù)集合。每個(gè)數(shù)據(jù)集合的第一行是兩個(gè)整數(shù)W和H,分別表示x方向和y方向瓷磚的數(shù)量。W和H都不超過(guò)20。在接下來(lái)的H行中,每行包括W個(gè)字。每個(gè)字符表示一塊瓷磚的顏色,規(guī)則如下
- ‘.’:黑色的瓷磚;
- ‘#’:白色的瓷磚;
- ‘@’:黑色的瓷磚,并且你站在這塊瓷磚上。該字符在每個(gè)數(shù)據(jù)集合中唯一出現(xiàn)一次。
當(dāng)在一行中讀入的是兩個(gè)零時(shí),表示輸入結(jié)束。
輸出
對(duì)每個(gè)數(shù)據(jù)集合,分別輸出一行,顯示你從初始位置出發(fā)能到達(dá)的瓷磚數(shù)(記數(shù)時(shí)包括初始位置的瓷磚)。
輸入樣列
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0
輸出樣例
45
算法實(shí)現(xiàn)
using System;
namespace Questions{
class Program{
public static void Main(string[] args){
while (true)
{
string input = Console.ReadLine();
string[] data = input.Split(' ');
int m = int.Parse(data[0]);
int n = int.Parse(data[1]);
if (m == 0 || n == 0)
break;
char[,] res = new char[n, m];
int indexM = 0, indexN = 0;
for (int i = 0; i < n; i++)
{
input = Console.ReadLine();
for (int j = 0; j < m; j++)
{
res[i, j] = input[j];
if (input[j] == '@')
{
indexM = j; indexN = i;
}
}
}
Result(ref res, indexM, indexN);
int sum = 1;
foreach (char item in res)
{
if (item == '0')
sum++;
}
Console.WriteLine(sum);
}
Console.ReadKey();
}
public static void Result(ref char[,] result, int m, int n)
{
if (m - 1 >= 0)
{
if (result[n, m - 1] == 46)
{
result[n, m - 1] = '0';
Result(ref result, m - 1, n);
}
}
if (n - 1 >= 0)
{
if (result[n - 1, m] == 46)
{
result[n - 1, m] = '0';
Result(ref result, m, n - 1);
}
}
if (m + 1 < result.GetLength(1))
{
if (result[n, m + 1] == 46)
{
result[n, m + 1] = '0';
Result(ref result, m + 1, n);
}
}
if (n + 1 < result.GetLength(0))
{
if (result[n + 1, m] == 46)
{
result[n + 1, m] = '0';
Result(ref result, m, n + 1);
}
}
}
}
}