Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.06.2015, 22:17
Новичок на форуме
Отправить личное сообщение для Воскобоенко Посмотреть профиль Найти все сообщения от Воскобоенко
 
Регистрация: 06.06.2015
Сообщений: 7

Двумерный массив. Магический квадрат.
Добрый вечер! Помогите, пожалуйста, решить следующую задачу.
Написать программу, которая проверяет, является ли матрица(3х3), введенная пользователем, магическим квадратом.
Ответить с цитированием
  #2 (permalink)  
Старый 09.06.2015, 01:32
Аспирант
Отправить личное сообщение для Endy Посмотреть профиль Найти все сообщения от Endy
 
Регистрация: 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;
};
Ответить с цитированием
  #3 (permalink)  
Старый 09.06.2015, 09:38
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Не известно во что вводят, поэтому пусть есть исходный массив.
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. А вот как проверять, это тоже зависит от того во что ввод.
Ответить с цитированием
  #4 (permalink)  
Старый 09.06.2015, 15:15
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование в двумерный массив djan Элементы интерфейса 1 13.09.2014 07:47
Создать двумерный массив и заполнить maternik Общие вопросы Javascript 3 19.10.2013 20:25
ДвумернЫй массив в базу и обратно Alexonus Общие вопросы Javascript 7 13.03.2013 19:05
Задачки на двумерный массив rjabijj Серверные языки и технологии 1 03.07.2012 09:06
Задачки на двумерный массив rjabijj Элементы интерфейса 2 02.07.2012 18:58