3 x 3 的幻方是乙個填充有從 1 到 9的不同數字的 3 x 3 矩陣,其中每行,每列以及兩條對角線上的各數之和都相等。
給定乙個由整數組成的grid
,其中有多少個 3 × 3 的 「幻方」 子矩陣?(每個子矩陣都是連續的)。
示例:
輸入:[[4,3,8,4],[9,5,1,9],
[2,7,6,2]]輸出:1解釋:下面的子矩陣是乙個 3 x 3 的幻方:
438951
276而這乙個不是:
384519
762總的來說,在本示例所給定的矩陣中只有乙個 3 x 3 的幻方子矩陣。
1 <= grid.length <= 10
1 <= grid[0].length <= 10
0 <= grid[i][j] <= 15
題目要求1-9組成3*3的矩陣,每個數字都要用上,所以對應的每行每列值都為15, 故中間值須為5
這樣可以去除大部分無用運算
其他只要注意邊界條件,依次判斷即可
class solution
int total = 15;
int count = 0;
for(int i = 2; i < grid.size(); ++i)
return count;
}void judgecol(vector>& grid, int row, int total, int col, int& count)
vectordict(10, false);
bool equal = lines(grid, row_begin, row, col - 2, col, total, dict);
bool not_all_used = allnumbernotused(dict);
if (!equal || not_all_used)
int s = grid[row_begin][col - 2] + grid[row_begin + 1][col - 1] +
grid[row_begin + 2][col];
if (s != total)
int t = grid[row_begin][col] + grid[row_begin + 1][col - 1] +
grid[row_begin + 2][col - 2];
if (t != total)
count += 1;
col += 1;}}
bool allnumbernotused(vector& dict)
}return false;
}bool lines(vector>& grid, int s_begin, int s_end, int t_begin,int t_end, int total, vector& dict)
s += grid[i][j];
dict[grid[i][j]] = true;
}if (s != total)
}for (int j = t_begin; j <= t_end; ++j)
if (t != total)
}return true;
}};
leetcode 840 矩陣中的幻方
3 x 3 的幻方是乙個填充有從 1 到 9 的不同數字的 3 x 3 矩陣,其中每行,每列以及兩條對角線上的各數之和都相等。給定乙個由整數組成的 grid,其中有多少個 3 3 的 幻方 子矩陣?每個子矩陣都是連續的 示例 輸入 4,3,8,4 9,5,1,9 2,7,6,2 輸出 1 解釋 下面...
LeetCode 840 矩陣中的幻方(C )
3 x 3 的幻方是乙個填充有從 1 到 9的不同數字的 3 x 3 矩陣,其中每行,每列以及兩條對角線上的各數之和都相等。給定乙個由整數組成的grid,其中有多少個 3 3 的 幻方 子矩陣?每個子矩陣都是連續的 示例 輸入 4,3,8,4 9,5,1,9 2,7,6,2 輸出 1解釋 下面的子矩...
力扣 矩陣中的幻方
矩陣中的幻方 3 x 3 的幻方是乙個填充有從 1 到 9 的不同數字的 3 x 3 矩陣,其中每行,每列以及兩條對角線上的各數之和都相等。給定乙個由整數組成的 grid,其中有多少個 3 3 的 幻方 子矩陣?每個子矩陣都是連續的 輸入 4,3,8,4 9,5,1,9 2,7,6,2 輸出 1 解...