08.06.2015, 22:17
|
Новичок на форуме
|
|
Регистрация: 06.06.2015
Сообщений: 7
|
|
Двумерный массив. Магический квадрат.
Добрый вечер! Помогите, пожалуйста, решить следующую задачу.
Написать программу, которая проверяет, является ли матрица(3х3), введенная пользователем, магическим квадратом.
|
|
09.06.2015, 01:32
|
Аспирант
|
|
Регистрация: 15.05.2015
Сообщений: 41
|
|
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;
};
|
|
09.06.2015, 09:38
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Не известно во что вводят, поэтому пусть есть исходный массив.
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. А вот как проверять, это тоже зависит от того во что ввод.
|
|
09.06.2015, 15:15
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
/**
* @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());
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 09.06.2015 в 15:17.
|
|
|
|