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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

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

Добрый день! Прошу помочь, есть вот такая задача: заполнить матрицу N*M (любого размера) по спирали, начиная с любой боковой ячейки. Проблема моего решения в том, что заполнение происходит только с любой угловой позиции, но не с любой другой. помогите исправить логику поиска незанятых клеток, т. е. поиск _ближайших_ нулевых значений( которые рядом с последней позицией)
Вот код:
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
const int N = 10, M = 10;
typedef int matrix_t[N][M];
int startX;
int startY;
int lastY;
int lastX;
int dsx;
int dsy;
// Заполнить матрицу возрастающими натуральными числами по спирали.
// Рекурсивное решение.
// x, y - позиция "робота"
// dx, dy - направление движения
// dsx, dsy - первоначальное движение
// next - следующее значение, которое будет записано в матрицу
// turn - делался ли поворот на предыдущем шаге





void build_spiral(matrix_t a, int x=startX, int y=startY, int dx=dsx, int dy=dsy, int next=1)
{
	// Позиция существует и свободна: пишем следующее значение и идём прямо
	if (x>=0 && x<M && y>=0 && y<N && a[y][x] == 0) {	
		a[y][x] = next;
		lastX=x;
		lastY=y;
		build_spiral(a, x+dx, y+dy, dx, dy, next+1);
		return;
	}
	else {	// Позиция занята или не существует: возвращаемся и поворачиваем налево
		if (next > N*M) return;	// Больше некуда идти - вся матрица заполнена
		
	//* Логика поиска незанятых ячеек//
		if (dx==0 && dy==1) { build_spiral(a, x+1, y-1, 1, 0, next); return; }
		if (dx==1 && dy==0) { build_spiral(a, x-1, y-1, 0, -1, next); return; }
		if (dx==0 && dy==-1) { build_spiral(a, x-1, y+1, -1, 0, next); return; }
		if (dx==-1 && dy==0) { build_spiral(a, x+1, y+1, 0, 1, next); return; }
	//* Логика поиска незанятых ячеек//
	
	}
}


void init_matrix(matrix_t a)
{
	for(int i=0; i<N; i++) 
		for(int j=0; j<M; j++)
			a[i][j] = 0;
}
 
void print_matrix(matrix_t a)
{
	for(int i=0; i<N; i++) {
		for(int j=0; j<M; j++)
			cout << a[i][j] << "\t";
		cout << endl;
	}
}
 
int _tmain(int argc, _TCHAR* argv[])
{
	matrix_t matrix;
	cin >> startX;
	cin >> startY;
	startX--;
	startY--;
	
	//* определение первоначальнго движения
	if (startX==0 && startY!=M-1) {dsx = 0; dsy = 1;
	cout << dsx << " " << dsy << "\n\n";} //вниз
	else      {
	
	if (startX==N-1 && startY!=0) {dsx = 0; dsy =-1; 
	cout << dsx << " " << dsy << "\n\n";} //вверх
	else {
		
	
	if (startY==0 && startX!=0) {dsx =-1; dsy = 0;
	cout << dsx << " " << dsy << "\n\n";} //влево
	else {	
	

	if (startY==M-1 && startX!=N) {dsx = 1; dsy = 0;
	cout << dsx << " " << dsy << "\n\n";} //вправо
	}
	}
	}
	
	//*	
	init_matrix(matrix);
	build_spiral(matrix);
	print_matrix(matrix);
	getch();
	return 0;
}

Последний раз редактировалось Niconov; 05.12.2011 в 18:23.
Niconov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение квадрата 6х6 по спирали artacer Паскаль, Turbo Pascal, PascalABC.NET 8 10.06.2011 01:14
Работа с матрицами ElenaO Паскаль, Turbo Pascal, PascalABC.NET 0 25.05.2011 21:49
Заполнение квадратной матрицы по спирали [Delphi] willams Помощь студентам 2 13.12.2010 09:05
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
Заполнение матрицы по спирали (от центра влево-вниз-вправо-вверх) Баур Помощь студентам 4 03.12.2009 17:39