27.05.2012, 11:36. Просмотров 1704. Ответов 4
Добрый день при выполнении программы выходит ошибка:
Необработанное исключение в "0x00ce4893" в "Diskret.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfdfdfdfd".
Программа: Прямоугольная подматрица. Вводится матрица a(m,n) из 0 и 1. Найти в ней прямоугольную подматрицу из одних единиц максимального размера (т.е. с максимальным произведением высоты на длину).
Ошибка вылетает только тогда когда число столбцов больше числа строк при создании матрицы
Код программы:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
| #include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main() {
setlocale( LC_ALL,"");
int n,m,x;
int col=0, i,j, i1, j1, tmp, tmp1;
//Вводим параметры матрицы
cout<<"Пожалуйста введите число строк: "<<endl;
cin>>n;
cout<<"Пожалуйста введите число столбцов: "<<endl;
cin>>m;
//Создание матрицы
int** matr=new int*[n];
for(i=0;i<n;i++)
matr[i]=new int[m];
//Заполнение матрицы
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cout<<"Введите ["<<i+1<<"]["<<j+1<<"] элемент: ";
cin>>matr[i][j];
while ((matr[i][j]!=1)&&(matr[i][j]!=0)) {
cout<<"Необходимо ввести 0 или 1"<<endl;
cout<<"Введите ["<<i+1<<"]["<<j+1<<"] элемент: ";
cin>>matr[i][j];
}
}
}
cout<<"Сформированная матрица: "<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cout<<matr[i][j]<<" ";
}
cout<<endl;
}
//Начало вычисление максимальной площади
for(i=0; i<m; i++)
for(j=0; j<n; j++)//перебираем элементы матрицы
{
if(matr[i][j]!=0)//если очередной элемент равен 1
{
tmp=0;
for(j1=j; j1<n && matr[i][j1]!=0; j1++)//идем вправо, пока не встретим элемент равный 0 или пока не окончится матрица
{
tmp1=0;
for(i1=i; i1<m && matr[i1][j1]!=0; i1++)// идем вниз пока не встретится элемент равный 0 или пока не кончится матрица
tmp1++;//увеличиваем значение
if(!tmp)// если tmp равно 0
tmp=tmp1;
else// если tmp не равно 0
{
if(tmp>tmp1)
tmp=tmp1;
}
if(col<tmp*(j1-j+1))// tmp*(j1-j+1) - здесь вычисляется вот что: в tmp находится значение на сколько опустились вниз, а (j1-j+1) - на сколько ушли вправо
col=tmp*(j1-j+1);
}
}
}
//Вывод максимальной площади и выход из программы
cout<<"Максимальная прямоугольная подматрица имеет площадь = "<<col<<endl;
getch();
return 0;
} |
|
Ошибка вылетает в этом месте:
C++ |
1
| for(i1=i; i1<m && matr[i1][j1]!=0; i1++)// идем вниз пока не встретится элемент равный 0 или пока не кончится матрица |
|