题目描述
给你n∗m的二维网格,求2∗2的方格的个数,方框里面的字符可以构成'face'输入描述:
第一行输入两个整数n,m。接下来n行每行m个小写字符 (1<=n,m<=50)输出描述:
输出满足条件的2∗2的方格的数量示例1
输入:
2 3
fac
cef
输出:2解题思路:
首先用一个 n∗m 的二维数组 arr 存储输入数据。然后从 i = 0 和 j = 0 开始,遍历 arr中的每个元素,但只需要遍历到 i = n-2 和 j = m-2。因为继续遍历不会存在2∗2的方格。声明一个变量cnt,用于统计满足输出描述的方格数量。在遍历每个元素时,若遇到 arr[i] 是'face'中的字符,则检查该元素的右边,下边和斜下边的元素是否也是'face'中的字符,并且还要检查这四个字符是否两两不同,若都满足条件则 cnt++。可以声明一个 HashSet 的数据结构,在最开始便存放'face'这四个字符,则可以使用 Contains() 方法在 时间内快速判断 arr[i] 是否为'face'中的字符。同理,还可以另外声明一个 HashSet,用于判断遍历到的方格内的元素是否两两不同。
注意: HashSet这个数据结构是 C# 自带的。C# 代码:
using System; using System.Collections.Generic; class Program{ static void Main(){ string input; string[] tokens; HashSet<char> hs = new HashSet<char>("face"); HashSet<char> tmp = new HashSet<char>(); int[][] del = new int[][]{ new int[]{0,1}, new int[]{1,0}, new int[]{1,1} }; while((input = Console.ReadLine()) != null){ tokens = input.Split(); int n = int.Parse(tokens[0]); int m = int.Parse(tokens[1]); char[][] arr = new char[n][]; for(int i = 0; i < n; i++){ arr[i] = new char[m]; input = Console.ReadLine(); for(int j = 0; j < m; j++) arr[i][j] = input[j]; } int cnt = 0; for(int i = 0; i < n-1; i++){ for(int j = 0; j < m-1; j++){ char c = arr[i][j]; if(hs.Contains(c)){ tmp.Add(c); foreach(int[] d in del){ c = arr[i+d[0]][j+d[1]]; if(!tmp.Contains(c) && hs.Contains(c)) tmp.Add(c); } if(tmp.Count == 4) cnt++; tmp.Clear(); } } } Console.WriteLine(cnt); } } }