Algorytm pozycjonowania liczb w tablicy

0

Na wejściu podane są 2 liczby całkowite: m i n.
Utwórz tablicę dwuwymiarową [m][n], która będzie wypełniona kolejnymi liczbami w następujący sposób:

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

-->--->--->--
| -->-->--- |
/\ | /
| ...--<-- |
-----<---<---

podajesz 2 liczby i tak tworzona jest tablica dwu wymiarowa.
Kto wie jak obojętnie w jakim języku . Sie zastanawiam czy nie ma wzoru na to jakiegoś . Czy może technicznie to trzeba rozwiązać ?? Jakies sugestie ? Mam z tym problem
I tez jetem ciekaw jak można to rozwiązac.

0

Rozwiązanie najbardziej trywialne to takie z "wektorami". Zaczynasz od 0,0 i przesuwasz się o wektor (0,1) aż nie dojdziesz do krawędzi, wtedy zmieniasz na wektor (1,0), później (0,-1) i na koniec (-1,0). Po obiegu jednej pętli obcinasz brzeg (tzn warunek na krawędzie ulega modyfikacji) i tak postępujesz aż nie dojdziesz do końca.

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

int main()
  {
   while(true)
     {
      cout<<"Podaj wymiary: ";
      int Y,X;
      if(cin>>Y>>X)
        {
         if((Y<=0)||(X<=0)) return 0;
         int **tb=new int*[Y];
         for(int y=0;y<Y;++y) tb[y]=new int[X];
         int up=0,dn=Y-1,lf=0,rt=X-1,nr=0,width=2+(int)log10(Y*X);
         while((up<=dn)&&(lf<=rt))
           {
            if(up<=dn) for(int x=lf;x<=rt;++x) tb[up][x]=++nr;
            ++up;
            if(lf<=rt) for(int y=up;y<=dn;++y) tb[y][rt]=++nr;
            --rt;
            if(up<=dn) for(int x=rt;x>=lf;--x) tb[dn][x]=++nr;
            --dn;
            if(lf<=rt) for(int y=dn;y>=up;--y) tb[y][lf]=++nr;
            ++lf;
           }
         for(unsigned y=0;y<Y;++y,cout<<endl) for(unsigned x=0;x<X;++x) cout<<setw(width)<<tb[y][x];
        }
      else
        {
         cout<<"Blad wprowadzenia"<<endl;
         cin.clear();
        }
      while(cin.get()!='\n') {}
     }
  }
0

Drobna modyfikacja algorytmu @Shalom'a. Wpierw wypełniamy tablice zerami (jeśli język sam nie zeruje nowej tablicy), a potem jedziemy w prawo dopóki jest 0 i tablica się nie skończyła, potem skręcamy w dół,...Implementacja w Javie (która nie wymaga zerowania tablicy):

final int RIGHT = 1;
final int DOWN = 2;
final int LEFT = 3;
final int UP = 4;
int kierunek = RIGHT;
int rows = ...;
int cols = ...;
int[][] t = new int[rows][cols];     
int w = 0;
int k = 0;
for(int i=1;i<=rows*cols;i++)
{
     t[w][k] = i;
     switch(kierunek)
     {
            case RIGHT:
                 if(k<cols-1 && t[w][k+1]==0)
                     ++k;
                 else
                 {
                     ++w;
                     kierunek = DOWN;
                 }
                 break;
            case DOWN:
                 if(w<rows-1 && t[w+1][k]==0)
                     ++w;
                 else
                 {
                     --k;
                     kierunek = LEFT;
                 }
                 break;
            case LEFT:
                 if(k>0 && t[w][k-1]==0)
                     --k;
                 else
                 {
                     --w;
                     kierunek = UP;
                 }
                 break;
            case UP:
                 if(w>0 && t[w-1][k]==0)
                     --w;
                 else
                 {
                     ++k;
                     kierunek = RIGHT;
                 }
                 break;
       }
}
0

Tak a propos do tego zadania nawet tablica nie jest potrzebna:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
int main()
  {
   while(true)
     {
      cout<<"Podaj wymiary: ";
      int Y,X;
      if(cin>>Y>>X)
        {
         if((Y<=0)||(X<=0)) return 0;
         int hy=Y>>1,hx=X>>1,width=2+(int)log10(Y*X);
         for(int by=0,ey=Y-1;by<Y;++by,--ey,cout<<endl)
           {
            for(int bx=0,ex=X-1;bx<X;++bx,--ex)
              {
               int p;
               if(by<=hy)
                 {
                  if(bx>=hx) p=ex>by?0:1;
                  else       p=bx<by?3:0;
                 }
               else
                 {
                  if(bx>=hx) p=ex<ey?1:2;
                  else       p=bx>ey?2:3;
                 }
               cout<<setw(width);
               if(p==3)      cout<<(1+ex+ey+(2*bx+1)*(-bx+by+ex+ey));
               else if(p==2) cout<<(1+ex+ey+(2*ey+1)*(bx+by+ex-ey));
               else if(p==1) cout<<(1+3*ex-ey+(2*ex+1)*(bx+by-ex+ey));
               else          cout<<(1+4*by-ex-ey+(2*by+1)*(bx-by+ex+ey));
              }
           }
        }
      else
        {
         cout<<"Blad wprowadzenia"<<endl;
         cin.clear();
        }
      while(cin.get()!='\n') {}
     }
  }

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