Двумерный массив. Магический квадрат.
Добрый вечер! Помогите, пожалуйста, решить следующую задачу.
Написать программу, которая проверяет, является ли матрица(3х3), введенная пользователем, магическим квадратом. |
var f = prompt('Vals 1!', '2,7,6').split(','), s = prompt('Vals 2!', '9,5,1').split(','), t = prompt('Vals 3!', '4,3,8').split(','); alert(isMagic([f, s, t])); function isMagic(matrix) { for (var i = 0; i < matrix.length; i++) { var e = matrix[i]; for (var j = 0; j < e.length; j++) { e[j] = +e[j]; } } var diagonals = [ [], [] ], rows = [], cols = [ [], [], [] ]; for (var i = 0; i < matrix.length; i++) { var e = matrix[i], rSum = 0; for (var j = 0; j < e.length; j++) { rSum += e[j]; } rows.push(rSum); diagonals[0].push(e[i]); cols[0].push(e[0]); cols[1].push(e[1]); cols[2].push(e[2]); } var count = 1; for (var i = 0; i < matrix.length; i++) { var e = matrix[i] diagonals[1].push(e[e.length - count]); count++; } for (var i = 0; i < cols.length; i++) { var e = cols[i], s = 0; for (var j = 0; j < e.length; j++) { s += e[j]; } cols[i] = s; } for (var i = 0; i < diagonals.length; i++) { var e = diagonals[i], s = 0; for (var j = 0; j < e.length; j++) { s += e[j]; } diagonals[i] = s; } if (diagonals[0] == diagonals[1] && rows[0] == rows[1] && rows[1] == rows[2] && cols[0] == cols[1] && cols[1] == cols[2]) { return 'Magic square'; }; return false; }; |
Не известно во что вводят, поэтому пусть есть исходный массив.
var a = [ [2, 7, 6], [9, 5, 1], [4, 3, 8] ], m = [0], x = y = 0; for(var i=0, k = a.length * a.length; i < k; i++ ) { var n = i%a.length, j = Math.floor(i/a.length); if(i && !(n)) { if(x != y || m[0] && m[0] != x) { m.push(0); break; } else m[0] = x; x = y = 0; } x += a[j][n]; y += a[n][j]; } alert(m.length > 1 ? 'Not' : 'Yes') PHP $a = [ [2, 7, 6], [9, 5, 1], [4, 3, 8] ]; $n = array_map('array_sum', $a); for($i=0; $i < count($a[0]); $i++) array_push($n, array_sum(array_column($a, $i))); echo count(array_unique($n)) > 1 ? 'Not' : 'Yes'; Нужно только проверять, что передан массив, и что его элементы, это тоже массивы, и количество их элементов одинаково у всех и равно количеству элементов массива в который они вложены, и это число должно быть более 1. А вот как проверять, это тоже зависит от того во что ввод. |
/** * @see [url]https://ru.wikipedia.org/wiki/Магический_квадрат[/url] * @param {Array<Array<Number>>} matrix * @constructor */ function Square(matrix) { this.__matrix = matrix; } /** * @returns {Boolean} */ Square.prototype.isMagic = function() { var lastRow = this.__matrix.length - 1; var lastColumn = this.__matrix[0].length - 1; var magicConst = this.getMagicConst(); for(var i = 0; i <= lastRow; i++) { if (this.__calcSum(i, 0, 0, 1, i, lastColumn) !== magicConst) return false; } for(var j = 0; j <= lastColumn; j++) { if(this.__calcSum(0, j, 1, 0, lastRow, j) !== magicConst) return false; } if(this.__calcSum(0, 0, 1, 1, lastRow, lastColumn) !== magicConst) return false; if(this.__calcSum(lastRow, 0, -1, 1, 0, lastColumn) !== magicConst) return false; return true; }; /** * @returns {Number} */ Square.prototype.getMagicConst = function() { var k = this.__matrix.length; return (k * (k * k + 1)) / 2; }; /** * @param {Number} rowStart * @param {Number} colStart * @param {Number} rowStep * @param {Number} colStep * @param {Number} rowEnd * @param {Number} colEnd * @returns {Number} * @private */ Square.prototype.__calcSum = function(rowStart, colStart, rowStep, colStep, rowEnd, colEnd) { var min = Math.min; var max = Math.max; var limitRow = rowStep > 0 ? min : max; var limitCol = colEnd > 0 ? min : max; var i = limitRow(rowStart - rowStep, rowEnd); var j = limitCol(colStart - colStep, colEnd); var sum = 0; while(i !== rowEnd || j !== colEnd) { i = limitRow(i + rowStep, rowEnd); j = limitCol(j + colStep, colEnd); sum += this.__matrix[i][j]; } return sum; }; // ------------------------ var matrix = [ [2, 7, 6], [9, 5, 1], [4, 3, 8] ]; var square = new Square(matrix); alert(square.isMagic()); |
Часовой пояс GMT +3, время: 17:12. |