Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2011, 20:26   #1
Niconov
Новичок
Джуниор
 
Регистрация: 15.11.2011
Сообщений: 2
По умолчанию Задача в двумерных массивах

Добрый день! Прошу помощи в такой задаче:
Пользователь вводит размер таблицы (sizeX sizeY) и начальную боковую ячейку (startX startY), с которой нужно начинать действия.
Согласно этим условиям требуется заполнить данную таблицу по спирали (по часовой стрелке) начиная со стартовой ячейки. Каждая из ячеек таблицы должна быть заполнена.
Вот примеры таких таблиц:
Код:
таблица 7х5, начало startX=2, startY=1.

21 1  2  3  4  5  6
20 22 23 24 25 26 7
19 33 34 35 36 27 8
18 32 31 30 29 28 9
17 15 14 13 12 11 10
вот два экземпляра моего кода (1ый будет "чистовиком", 2ой - тестовый, который нужно подредактировать).

Итак 1ый:
Цитата:
#pragma hdrstop
#pragma argsused

#include <iostream.h>
#include <conio.h>

int sizeX;
int sizeY;
int startX;
int startY;
int n =1;
int x;
int y;
int st = 0;//текущая сторона
int size;
void enter()
{
cout << "vvedite max x & y \n";
cin >> sizeX;
cin >> sizeY;
cout << "vvedite start X & Y\n";
cin >> startX;
cin >> startY;
size = sizeX*sizeY;
}

void print(int **Mas)
{
for (y=0; y < sizeY; y++)
{
for (x = 0; x < sizeX; x++) {
cout << " " << Mas[y][x];
if (x == sizeX-1) {
cout << "\n";
}
}
}
}

#pragma argsused;
void main(int argc, _TCHAR* argv[])
{
enter();
cout << "vvedenni razmery" << sizeX << "x" << sizeY << " nachalo: x=" << startX << "y=" << startY << "\n";

int **Mas = new int*[sizeY];

for ( int i = 0; i < sizeY; i++ ) Mas[i] = new int[sizeX];
for ( int y = 0; y < sizeY; y++ ) {
for ( int x = 0; x < sizeX; x++ ) Mas[y][x] = 0;}


while (n == size){
if (startX==1 && !(startY==1)) {
//выполнение движения вверх
for (x = startX; x < sizeX+1; x++) {

}
}
if (!(startX==1) && startY==sizeY) {
//движение влево
}
if (startX==sizeX && !(startY==sizeY)) {
//движение вниз
}
if(!(startX==sizeX) && startY=1) {
//движение влево
}

}//кц



print(Mas);
getch();
}
И вот второй, для редактирования:

Цитата:
#include <iostream.h>

using namespace std;

int sizeX;
int sizeY;
int startX;
int startY;
int napr;
int summ;
int x;
int y;
int n = 1;
int m = 0;
int **mass = new int*[sizeX];
int **mass_p = new int*[sizeX];
int nX = 0; //корректировка
int nY = 0; //корректировка
int tX;
int tY;

void vpravo(int n, int **mass){
y=startX;
for (x=startX; x < sizeX ; x++) {
mass[x][y] = n;
n++;
nY++;
}
/* спорно startX=sizeX-1;
startY=sizeY-1; */

}

void vniz(int n, int **mass){
x=startX;
for (y=0; y == sizeY; y++) {
mass[x][y] = n;
n++;
}
}

void vlevo(int n, int **mass){
y=startY;
for (x=sizeX-1; x == 0; x--) {
mass[x][y] = n;
n++;
}
}

void vverh(int n, int **mass){
y=startY;
for (y=sizeY-1; y == 0; y--) {
mass[x][y] = n;
n++;
tX = 1;
tY = 1;
}
}

void print()
{
for ( y = 0; y < sizeY; y++ )
{
for ( x = 0; x < sizeX; x++ )
{
if ( mass[y][x] < 10 ) cout << "" << mass[y][x] << " ";
else
if ( 10 < mass[y][x] && mass[y][x] <= 100 ) cout << "" << mass[y][x] << " ";
else if ( 100 < mass[y][x] && mass[y][x] <= 1000 ) cout << "" << mass[y][x] << " ";
else cout << mass[y][x] << "";
}
cout << endl;
}
}

int main ()
{
cout <<"Hello! Enter size of table X*Y \n";
cin >> sizeX;
cin >> sizeY;
cout <<"Enter start position on border: \n X: ";
cin >> startX;
cout <<"\n Y: ";
cin >> startY;
cout << "\nSize table:" << sizeX << "x" << sizeY << "\n";
{
if (!(startX == 1 || startY == 1 || startX == sizeX || startY == sizeY))
{cout << "No border sector"; cin>> ""; return 0; }
};

tX=startX;
tY=startY;
for ( int i = 0; i < sizeY; i++ ) mass[i] = new int[sizeY];
for (x=0; x < sizeX; x++) {
for (y=0; y < sizeY; y++) {
mass[x][y] = 0;
}
}
cout << "\n";


while (n == summ){



if (tX==1 && !(tY==1)) { //движение вверх
cout << "1";
vverh(n, mass);
break;
}else{
if (!(tX==1) && tY==sizeY) {//движение влево
vlevo(n, mass);
cout <<"2";
break;
} else {
if (tY==1 && !(tX==sizeX) ) { //движение вправо
vpravo(n, mass);
cout << "3";
break;
} else { if (tX==sizeX && tY==1) { //движение вниз
cout << "4";
vniz(n, mass);
break;
}
}
}


} }

print();


cin >>"";
return 0 ;
};
и вот еще работающая программа, но заполняет только с первой ячейки, ссылка на архивпрограммы+исходников

Прошу помощи по выполнению этой задачи! Помогите кто чем может с алгоритмом заполнения...

//Извините за мой французский, но Си++ я изучил в ускоренных темпах за 6 дней как смог, поэтому с радостью послушаю комментарии по коду
Niconov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача из двумерных массивов Malyshka Microsoft Office Excel 1 13.12.2010 15:51
Вопрос о двумерных массивах nicklan Visual C++ 10 12.10.2010 12:15
Сортировка и перестановка элементов в двумерных массивах nikshiyan Паскаль, Turbo Pascal, PascalABC.NET 3 18.07.2010 14:36
поиск минимума и максимума в двумерных массивах qbasic Bentli Помощь студентам 3 19.06.2010 20:00