问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3752 访问。

3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。

给定一个由整数组成的 m * n 矩阵,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。

输入: [[4,3,8,4],

      [9,5,1,9],

      [2,7,6,2]]

输出: 1

解释: 

下面的子矩阵是一个 3 x 3 的幻方:

438

951

276

而这一个不是:

384

519

762

总的来说,在本示例所给定的矩阵中只有一个 3 x 3 的幻方子矩阵。

提示:

1 <= grid.length = grid[0].length <= 10

0 <= grid[i][j] <= 15


A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum.

Given an grid of integers, how many 3 x 3 "magic square" subgrids are there?  (Each subgrid is contiguous).

Input: [[4,3,8,4],

        [9,5,1,9],

        [2,7,6,2]]

Output: 1

Explanation: 

The following subgrid is a 3 x 3 magic square:

438

951

276

while this one is not:

384

519

762

In total, there is only one magic square inside the given grid.

Note:

1 <= grid.length <= 10

1 <= grid[0].length <= 10

0 <= grid[i][j] <= 15


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3752 访问。

public class Program {

    public static void Main(string[] args) {
int[][] nums = null; nums = new int[3][] {new int[]{4,3,8,4},
new int[] {9,5,1,9},
new int[] {2,7,6,2}
}; var res = NumMagicSquaresInside(nums);
Console.WriteLine(res); nums = new int[3][] {new int[]{1,0,3,8},
new int[] {3,7,2,4},
new int[] {5,8,1,0}
}; res = NumMagicSquaresInside2(nums);
Console.WriteLine(res); Console.ReadKey();
} private static int NumMagicSquaresInside(int[][] grid) {
var num = 0;
for(var i = 1; i < grid.Length - 1; i++) {
for(var j = 1; j < grid[i].Length - 1; j++) {
if(grid[i][j] == 5) {
num = IsMagicSquare(grid, i, j) ? ++num : num;
}
}
}
return num;
} private static bool IsMagicSquare(int[][] grid, int i, int j) {
//原始解法,不推荐
//记录每个值,看是不是9位,因为从1-9都必须出现
var dic = new Dictionary<int, int>();
dic[grid[i - 1][j - 1]] = grid[i - 1][j - 1];
dic[grid[i - 1][j]] = grid[i - 1][j];
dic[grid[i - 1][j + 1]] = grid[i - 1][j + 1]; dic[grid[i][j - 1]] = grid[i][j - 1];
dic[grid[i][j]] = grid[i][j];
dic[grid[i][j + 1]] = grid[i][j + 1]; dic[grid[i + 1][j - 1]] = grid[i + 1][j - 1];
dic[grid[i + 1][j]] = grid[i + 1][j];
dic[grid[i + 1][j + 1]] = grid[i + 1][j + 1]; //不为9或不在1-9范围之内,则不是幻方
if(dic.Count != 9) return false; foreach(var item in dic) {
if(item.Value > 9 || item.Value < 0) return false;
} //记录3行、3列、2对角线
var sum_row1 = grid[i - 1][j - 1] + grid[i - 1][j] + grid[i - 1][j + 1];
var sum_row2 = grid[i][j - 1] + grid[i][j] + grid[i][j + 1];
var sum_row3 = grid[i + 1][j - 1] + grid[i + 1][j] + grid[i + 1][j + 1]; var sum_col1 = grid[i - 1][j - 1] + grid[i][j - 1] + grid[i + 1][j - 1];
var sum_col2 = grid[i - 1][j] + grid[i][j] + grid[i + 1][j];
var sum_col3 = grid[i - 1][j + 1] + grid[i][j + 1] + grid[i + 1][j + 1]; var sum_cross1 = grid[i - 1][j - 1] + grid[i][j] + grid[i + 1][j + 1];
var sum_cross2 = grid[i - 1][j + 1] + grid[i][j] + grid[i + 1][j - 1]; var dic2 = new Dictionary<int, int>();
dic2[sum_row1] = 0;
dic2[sum_row2] = 0;
dic2[sum_row3] = 0; dic2[sum_col1] = 0;
dic2[sum_col2] = 0;
dic2[sum_col3] = 0; dic2[sum_cross1] = 0;
dic2[sum_cross2] = 0; //看值是不是相同并且值之和为15
return dic2.Count == 1 && sum_row1 == 15;
} private static int NumMagicSquaresInside2(int[][] grid) {
var num = 0;
for(var i = 1; i < grid.Length - 1; i++) {
for(var j = 1; j < grid[i].Length - 1; j++) {
if(grid[i][j] == 5) {
num = IsMagicSquare(grid, i, j) ? ++num : num;
}
}
}
return num;
} private static bool IsMagicSquare2(int[][] grid, int row, int col) {
//值必须是1-9
for(var i = row - 1; i <= row + 1; i++)
for(var j = col - 1; j <= col + 1; j++)
if(grid[i][j] < 1 || grid[i][j] > 9) return false;
//不考虑中间的5,只需要考虑4个位置的值的和为10即可
return !(grid[row - 1][col - 1] + grid[row + 1][col + 1] != 10 ||
grid[row - 1][col] + grid[row + 1][col] != 10 ||
grid[row - 1][col + 1] + grid[row + 1][col - 1] != 10 ||
grid[row][col - 1] + grid[row][col + 1] != 10);
} }

以上给出2种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3752 访问。

1
0

分析:

显而易见,以上2种算法的时间复杂度均为:  。

C#LeetCode刷题之#840-矩阵中的幻方(Magic Squares In Grid)的更多相关文章

  1. [Swift]LeetCode840. 矩阵中的幻方 | Magic Squares In Grid

    A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, co ...

  2. leetcode刷题-54螺旋矩阵

    题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 思路 对于每个外层,从左上方开始以顺时针的顺序遍历所有元素.假设当前层的左上角位于(to ...

  3. Leetcode刷题之螺旋矩阵

    矩阵之螺旋矩阵 总体思路: 注意遍历顺序 每次遍历一圈时候不要多加元素 Leetcode54螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. ...

  4. leetcode刷题-59螺旋矩阵2

    题目 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 思路 与螺旋矩阵题完全一致 实现 class Solution: def generateM ...

  5. C#LeetCode刷题之#671-二叉树中第二小的节点(Second Minimum Node In a Binary Tree)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4100 访问. 给定一个非空特殊的二叉树,每个节点都是正数,并且每 ...

  6. C#LeetCode刷题之#532-数组中的K-diff数对(K-diff Pairs in an Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3716 访问. 给定一个整数数组和一个整数 k, 你需要在数组里找 ...

  7. C#LeetCode刷题之#720-词典中最长的单词(Longest Word in Dictionary)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4120 访问. 给出一个字符串数组words组成的一本英语词典.从 ...

  8. leetcode刷题-94二叉树的中序遍历

    题目 给定一个二叉树,返回它的中序 遍历. 实现 # def __init__(self, x): # self.val = x # self.left = None # self.right = N ...

  9. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

随机推荐

  1. CentOS开机启动不了修复

    1,如果启动时进度条,先修改为日志启动 启动后快速按任何键(Enter除外)进入如下界面 在按e进入 选择第二个选项卡 在按e进入将红色部分 rhgb quiet 删除,然后按Enter,在按b重启 ...

  2. Python Ethical Hacking - WEB PENETRATION TESTING(3)

    CRAWLING SUMMARY Our crawler so far can guess: Subdomains. Directories. Files. Advantages: ->Disc ...

  3. 2.UDP协议

    UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能. 应用层给UDP多长的报文,UDP就照样发送,即一次发送一个完整报文 一.UDP首部格式 这里的长度是指(首部+数据) UDP校验 ...

  4. Java中Map的entrySet()详解

    转发:原博客 由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系.Map中采用Entry内部类来表示一个映射项,映射项包含Key和ValueMap.Entry里面包含getKey() ...

  5. java基础知识--数据类型

    计算机时识别不了我们编写的代码语言,计算机中的数据全部采用二进制表示,即0和1表示的数字,每一个0或者1就是一个位,一个位叫做一个bit(比特).(实际上计算机只能识别高低电平,而不是0和1.) 字节 ...

  6. DJANGO-天天生鲜项目从0到1-004-用户模块-个人中心页

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  7. jsp课堂笔记1

    http协议:规范浏览器和服务器交互或通信的规则 https:基于http实现,比http更加安全,提供了身份验证和通信内容加密  服务器:1.配置比较高的电脑  2.他就是一个应用 http1.0: ...

  8. 清晰架构(Clean Architecture)的Go微服务—重大升级

    去年,我创建了一个清晰架构(Clean Architecture)微服务框架,它功能强大,但有些重.我写了一个系列文章来讲述它,请参阅"清晰架构(Clean Architecture)的Go ...

  9. 离线安装paramiko

    1. 利用yum下载paramiko依赖的rpm软件包 安装yum-utils yum -y install yum-utils yumdownloader python-setuptoolsyumd ...

  10. Laragon修改配置快速创建其他框架的项目

    配置方式 依葫芦画瓢,如添加thinkPHP: # Thinkphp Thinkphp 3.2=composer create-project topthink/thinkphp %s Thinkph ...