Tablica MxN wypelnianie po spirali...

0

Mam za zadanie wykonać następujący program: "wypełnienie macierzy MxN spiralą od zewnątrz do środka,
poczynając od pola [0,0] zgodnie z ruchem wskazówek zegara". Udało mi się go zrobić, ale niestety nie działa dla niektórych tablic, jak np 12x7, bardzo prosiłbym o pomoc przy wykryciu błędu, może to złe warunki do pętli. Spędziłem już cały dzień na przerabianiu tego, ale wciąż nie mogę go doprowadzić do perfekcji. Zadanie jest łatwo wykonać dla tablic kwadratowych, niestety dla niektórych tablic prostokątnych, które da się wypełnić spiralą, program ten nie działa. Ponieważ jestem tu nowy, przesyłam kod w czytelnej formie na wklejka.pl.
http://wklej.org/id/938564/

0
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include <iostream>
using namespace std;

int main( )
{
	int sizeX, sizeY;
	cout << "Podaj wymiar X tablicy: ";
	cin >> sizeX;
	cout << "Podaj wymiar Y tablicy: ";
	cin >> sizeY;

	int rangeX[ 2 ] = { 0, sizeX };
	int rangeY[ 2 ] = { 1, sizeY }; // 1 dlatego, że pierwszy wiersz wypełnia się na samym początku

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

	int i, j = i = 0;
	for( j = 0; j < sizeY; ++j )
	{
		arr[ j ] = new int[ sizeX ];
		for( i = 0; i < sizeX; ++i )
			arr[ j ][ i ] = 0;				// Po utworzeniu czyścimy tablicę
	}

	int value = 0;
	int state = 0;

	j = i = 0;

	while( value != sizeX * sizeY )
	{
		cout << "Petla wykonala sie po raz: " << value + 1 << endl;

		switch( state % 4 ) // Są 4 stany, bo są 4 kierunki w których poruszamy się po tablicy
		{
		case 0 : // w prawo
			arr[ j ][ i++ ] = ++value;
			if( i == rangeX[ 1 ] )	// Przy końcowym sprawdzeniu indeks i jest poza zakresem
			{
				i = --rangeX[ 1 ];	// Zawężamy granicę z prawej strony i wracamy indeksem do odpowiedniej pozycji
				state++;			// Zmieniamy kierunek ruchu
				j++;				// Inkrementujemy j aby nie nadpisać ostatniej zapisanej wartości
			}
			break;

		case 1 :
			arr[ j++ ][ i ] = ++value;
			if( j == rangeY[ 1 ] )
			{
				// Powtarzamy kroki
				j = --rangeY[ 1 ];
				state++;
				i--;
			}
			break;

		case 2 :
			arr[ j ][ i-- ] = ++value;
			if( i < rangeX[ 0 ] )	// Przy końcowym sprawdzeniu i musi wyjść poza zakres
			{
				i = rangeX[ 0 ]++;	// i musi się zwiększyć o 1 dlatego jest postinkrementacja
				state++;
				j--;
			}
			break;

		case 3 :
			arr[ j-- ][ i ] = ++value;
			if( j < rangeY[ 0 ] )
			{
				j = rangeY[ 0 ]++;
				state++;
				i++;
			}
			break;

		default:
			break;
		}
	}

	cout << endl;

	for( j = 0; j < sizeY; ++j )
	{
		for( i = 0; i < sizeX; ++i )
			cout << arr[ j ][ i ] << "\t";
		cout << endl;
	}

	for( j = 0; j < sizeY; ++j )
		delete [] arr[ j ];
	delete [] arr;

	getchar( );
	getchar( );
	return 0;
}
1

OMG!! @Done., stworzyłeś potwora!

#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;

int main()
  {
   while(true)
     {
      cout<<"Podaj Y X: ";
      int Y,X;
      cin>>Y>>X;
      if((X<=0)||(Y<=0)) break;
      int size=Y*X,n=0,y=0,x=0,col=X,width=(int)log10(size)+1,*tb=new int[size];
      --X;
      --Y;
      while((y<=Y)&&(x<=X))
        {
         for(int i=x;(y<=Y)&&(i<=X);++i) tb[y*col+i]=++n;
         ++y;
         for(int i=y;(x<=X)&&(i<=Y);++i) tb[i*col+X]=++n;
         --X;
         for(int i=X;(y<=Y)&&(i>=x);--i) tb[Y*col+i]=++n;
         --Y;
         for(int i=Y;(x<=X)&&(i>=y);--i) tb[i*col+x]=++n;
         ++x;
        }
      for(int i=0;i<size;++i)
        {
         bool f=(i%col);
         if((!f)&&(i)) cout<<endl;
         cout<<setw(width+f)<<tb[i];
        }
      delete[] tb;
      cout<<endl<<endl;
     }
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1