สมมติว่าเรามีกริด เราต้องหาจำนวนตารางย่อยของตารางเวทย์มนตร์ลงในกริดนั้น เมจิกสแควร์คือตารางขนาด 3 x 3 ที่มีตัวเลขตั้งแต่ 1 ถึง 9 ที่แตกต่างกัน ทำให้แต่ละแถว คอลัมน์ และเส้นทแยงมุมทั้งสองมีผลรวมเท่ากัน
ดังนั้นหากอินพุตเป็นแบบ
4 | 3 | 8 | 4 |
9 | 5 | 1 | 9 |
2 | 7 | 6 | 2 |
จากนั้นผลลัพธ์จะเป็น 1 เนื่องจากตารางมายากล
4 | 3 | 8 |
9 | 5 | 1 |
2 | 7 | 6 |
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดหนึ่งชุดที่มีค่า:[816357492, 834159672, 618753294, 672159834,492357816, 438951276, 294753618, 276951438]
- กำหนดอาร์เรย์ออฟเซ็ตขนาด:9 x 2 :={{-2,-2},{-2,-1},{-2,0},{-1,-2},{-1 ,-1},{-1,0},{0,-2},{0,-1},{0,0}}
- ตอบ :=0
- สำหรับการเริ่มต้น i :=2 เมื่อฉัน <จำนวนแถวของกริด อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- สำหรับการเริ่มต้น j :=2 เมื่อ j <จำนวนแถวของกริด อัปเดต (เพิ่ม j ขึ้น 1) ทำ −
- ผลรวม :=0
- สำหรับการเริ่มต้น k :=0 เมื่อ k <9 อัปเดต (เพิ่ม k ขึ้น 1) ทำ −
- sum :=sum * 10
- sum :=sum + grid[i + offset[k, 0], j + offset[k, 1]]
- ans :=ans + การเกิดขึ้นของผลรวมใน s
- สำหรับการเริ่มต้น j :=2 เมื่อ j <จำนวนแถวของกริด อัปเดต (เพิ่ม j ขึ้น 1) ทำ −
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#includeใช้เนมสเปซ std;class Solution {public:int numMagicSquaresInside(vector >&grid) {const unordered_set s{816357492, 834159672, 618753294, 672159834, 492357816, 438951276, 294753618,276951438}; ชดเชย int [][2] ={{-2, -2}, {-2, -1}, {-2, 0},{-1, -2}, {-1, -1}, { -1, 0}, { 0, -2}, { 0, -1}, { 0, 0}}; int ans =0; สำหรับ (int i =2; i > v ={{4,3,8,4},{9,5,1,9},{2,7,6,2}}; ศาล <<(ob.numMagicSquaresInside(v));}
อินพุต
<ก่อน>{{4,3,8,4},{9,5,1,9},{2,7,6,2}}ผลลัพธ์
1