 
			
				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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |