• 题目描述
    给你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);
          }
      }
    }