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
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;
}