2015-03-20 2 views
1

Мне нужно построить массив 2d с N, M строками и столбцами (N & M < = 5), тогда пользователь вводит определенный индекс (местоположение), как 2, 3 (матрица [2] [3]) предполагается, что два числа находятся в границах матрицы. С этого момента я должен найти сумму левой и правой диагонали, которая проходит через число, однако число исключается из суммы.найти сумму диагональных элементов из заданного индекса в массиве 2d

Так, например, 2d массив туАггау [3] [3]

*1* 15 *2* 
2 *71* 8 
*5* 22 *5* 

Таким образом, пользователь входит 1,1, что является туАггау [1] [1], в этом случае число 71, то сумма будет 1 + 5 + 2 + 5 ... И хорошо, моя проблема в том, как я могу найти эти диагонали, не выходя из пределов.

For the left top i would go: 
row-- 
column-- 
while(row >= 0|| column >= 0) 

For left bottom: 
row++ 
colum++ 
while(row < N || column < M) 

for right top: 
row-- 
column++ 
while(row >= 0 || column < M) 

for right bottom: 
row++ 
column-- 
while(row < N || column >=0) 

(это плохо написана псевдо-код, извините)

Он отлично работает, когда я вхожу номера, которые не в верхней или нижней строке, но и в случаях, когда они расположены там мой программа останавливается.

+1

Без какого-либо кода, который будет отправлен, я проконсультируюсь с моим хрустальным шаром, и он ответит строкой 42. Поэтому, пожалуйста, разместите минимальный код, который демонстрирует проблему. –

ответ

1

У вас есть в основном хороший псевдокод. Моя первая мысль заключалась в том, что вы должны использовать & &, а не || при определении того, находится ли местоположение за пределами или нет.

Вам также необходим какой-то способ выхода на ранний срок, если они дают плохое место. Ниже приведен код, который я быстро выписал, и, кажется, работает с быстрым взглядом - я перебираю все возможные исходные местоположения, включая те, которые находятся за пределами.

#include <iostream> 

const int N = 3; 
const int M = 4; 
int matrix[N][M] = { 
     { 0, 1, 2, 3 }, 
     { 4, 5, 6, 7 }, 
     { 8, 9, 10, 11 } 
}; 

int directional_sum(int row, int column, int row_inc, int column_inc) 
{ 
    int sum = 0; 

    if (row < 0 || column < 0 || row >= N || column >= M) 
     return sum; 

    int temp_row = row + row_inc; 
    int temp_column = column + column_inc; 
    while (temp_row >= 0 && temp_column >= 0 && temp_row < N && temp_column < M) 
    { 
     sum += matrix[temp_row][temp_column]; 

     temp_row += row_inc; 
     temp_column += column_inc; 
    } 

    return sum; 
} 

int diagonal_sum(int row, int column) 
{ 
    int sum = 0; 
    sum += directional_sum(row, column, 1, 1); 
    sum += directional_sum(row, column, 1, -1); 
    sum += directional_sum(row, column, -1, 1); 
    sum += directional_sum(row, column, -1, -1); 

    return sum; 
} 

int main() 
{ 
    for (int i = -1; i <= N; i++) 
    { 
     for (int j = -1; j <= M; j++) 
     { 
      std::cout << "Sum for [" << i << ", " << j << "]: " << diagonal_sum(i, j) << std::endl; 
     } 
    } 

    return 0; 
} 
Смежные вопросы