Консультация № 68895
28.12.2006, 11:48
0.00 руб.
0 2 2
Подскажите, пожалуйста, как решитиь следующую задачу - "Заполнить матрицу (9х9) ЛП, от левого нижнего угла по диагонали: влево-вверх". ЛП-линейная последовательность. Я пытался всяко, последний вариант:
#include <iostream.h>
#include <conio.h>

int m[9][9];
int i, j, p, last_i, last_j;

int main() {
i=8; // задаю начальные координаты точки
j=0;

p=1;
while(p<82) {
if(i==8 && j==0) {
m[i][j]=p;
j++;
last_j=j; // тут я запоминаю номер столбца, с которого начинался послений счет
}
if(j!=0 && i==8) {
m[i][j]=p;
last_j=j;
j--;
i--;
}
if(j!=0 && i!=8) {
m[i][j]=p;
last_j==j;
j--;
i--;
}
if(j==0 && i!=8) {
m[i][j]=p;
i=8;
j=last_j+1;
}
p++;
}
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
// cout << "M[" << i << "][" << j << "] = " << m[i][j] <<endl;
cout << m[i][j] << " ";
if(j==8) {
cout << endl;
}
}
}

getch();
return 0;
}
Однако же, она не работает. Я перерыл весь инет, локалку Уфы, потратил очень много трафика, но ничего стоящего не нашел((
Подскажите, как ее решить, пожалуйста

Обсуждение

Неизвестный
28.12.2006, 12:50
общий
это ответ
Здравствуйте, Waitekk!
Если я правильно понял задачу (заполнение движущейся диагональной волной, на каждом гребне которой значение увеличивается на единицу - очень похожа на поиск кратчайшего пути в двумерной матрице, правда с приравниваем расстояний по сторонам и диагонали и упрощение начальных условий), то проще понять ее принцип:
1. Смени точку отсчета - пусть началом будет нужная вам клетка - левая нижняя (и ее координаты (1;1))
2. Отсчет по осям вправо и вверх.
3. Тогда легко понять, что каждая клетка имеет значение относительно ее координат - (i+j-1).
4. Переводим в систему отсчета матрицы в привычную для математика-программиста с началом от левого верхнего угла вправо и вниз и отсчетом от нуля. Преобразование координат дает формулу j=j1-1 i=m-i0, где i,j - преобразованные координаты, i0,j0- исходные m - количество строк матрицы(измерение i)
5. Таким образом задача сводится к двум вложенным циклам, сразу вместе с выводом результатов кстати.

А у вас в коде сходу несколько ошибок, хотя я и не совсем понял вааще его смысла, вы видимо собирались на каждой итерации заполнять все клетки, попавшие в очередной гребень волны. Это не есть гут по определению - в каждом гребне разное количество клеток - по-этому нужен как минимум еще вложенный цикл.
Кроме того - следите за кодом и сообщениями компилятора - даже хинтам и ворнингам - присвоение last_j==о - это не присвоение а операция сравнения - результат которой истина или ложь.
Зачем то вы ввели last_i - почему же нигде не используется? Видимо где то вместо нее написали last_j или вааще забыли.
В цикле вывода - вы переносите строку после каждых 8 элементов - только условие j==8 - не исполниться никогда - отсчет идет от 0 до n-1 - не забываем.
Вот это навскидку.
Неизвестный
28.12.2006, 12:50
общий
это ответ
Здравствуйте, Waitekk!
Пришел в голову только такой вариант решения (см. приложение)


Приложение:
#include <iostream.h>#include <conio.h>int m[9][9];int i, j, p, last_i, last_j;int main() { char flag; last_i=i=8; // çàäàþ íà÷àëüíûå êîîðäèíàòû òî÷êè last_j=j=0; flag=1; p=1; while(flag) { m[i][j]=p; if(!j||!i) { last_j++; j=(last_j<9)?last_j:8; if(last_j>8) last_i--; i=last_i; if(last_i<0) flag=0; } else { i--; j--; } p++; } for(i=0;i<9;i++) { for(j=0;j<9;j++) { // cout << "M[" << i << "][" << j << "] = " << m[i][j] <<endl; cout << m[i][j] << "\t"; if(j==8) { cout << endl; } } } getch(); return 0;}
Форма ответа