Mała podpowiedź jeśli chodzi o generowanie

0

Dzień dobry ponownie!
Nie jestem pewny, czy to dobre miejsce na takie kolokwialne pytanie, ale nie wiem gdzie indziej je zadać. Do rzeczy
http://www.spoj.com/problems/CPTTRN8/
Jest do napisania taki programik ze spoja. I teraz się zastanawiam, czy jest jakiś "knif", jak wymyślić odpowiednie warunki?
Metodą prób i błędów udało mi się stworzyć już te diamenciki, ale ni cholery nie mam pomysłu jak zrobić wewnętrzne gwiazdki, bez jakichś rozrośniętych ifów, switchów (chociaż nie wiem czy nawet tak bym dał radę).
Ma ktoś z Was jakąś dobrą radę jak się za to zabrać? Próbowałem sobie to rozpisywać wartościami zmiennych i, j i o ile dzięki temu zrobiłem "/" i "" to przy gwiazdkach nie widzę żadnych dobrych zależności.. Tak więc jakby ktoś mógł mnie jakoś lekko naprowadzić, bo nie chcę od razu całego kodu! To będę wdzięczny :)
A i swojego kodu też nie zamieszczam, żeby nikomu nie zepsuć zabawy.

1
#include <iostream>
using namespace std;

int main()
  {
   const char tb[]="/\\..**";
   cin.tie(0);
   ios::sync_with_stdio(false);
   unsigned t;
   for(cin>>t;t--;cout<<'\n')
     {
      int TY,TX,size;
      cin>>TY>>TX>>size;
      int ds=size<<1;
      for(int Y=0;Y<TY;++Y)
        {
         for(int y=-ds;y<ds;y+=2,cout<<'\n')
           {
            for(int X=0;X<TX;++X)
              {
               for(int x=-ds;x<ds;x+=2)
                 {
                  int v=abs(y+1)+abs(x+1);
                  cout<<tb[((((v<ds)<<1)|(v>ds))<<1)|((y<0)^(x<0))];
                 }
              }
           }
        }
     }
   return 0;
  }
0

Mówiłem, że nie chcę całego kodu na tacy! :D Ale i tak dzięki.. Ale powiem szczerze, że niewiele z tego rozumiem, bo nie znam jeszcze C++ i kilka kluczowych poleceń jest dla mnie niejasna, np.

tb[ ((((v<ds) << 1) | (v>ds)) << 1) | ((y<0) ^ (x<0)) ];

Skoro już zamieściłeś kod, to pokażę swój

#include <stdio.h>

void main() {
	int i,j,t,l,c,s;

	scanf("%d", &t);
	while (t--) {
		scanf("%d%d%d", &l, &c, &s);
		for (i = 0; i < (2*s)*l; ++i)
		{
			for (j = 0; j < (2*s)*c; ++j)
			{
				if (((j+ (i + 1) -s) % (2 * s)) == 0) printf("/");
				else if ((j - i + s) % (2 * s) == 0) printf("\\"); 
				else if() printf("*");
				else printf(".");				
			}printf("\n");
		}printf("\n");
	}
} 

Ale spróbuję to rozpracować

1
endlesik napisał(a):

Ale powiem szczerze, że niewiele z tego rozumiem, bo nie znam jeszcze C++ i kilka kluczowych poleceń jest dla mnie niejasna
Nie z tego powodu, tylko z powodu że nie znasz C. W C to dokładnie tak samo wygląda:

#include <stdio.h>

int main()
  {
   const char tb[]="/\\..**";
   unsigned t;
   for(scanf("%u",&t);t--;putchar('\n'))
     {
      int TY,TX,size;
      scanf("%d%d%d",&TY,&TX,&size);
      int ds=size<<1;
      for(int Y=0;Y<TY;++Y)
        {
         for(int y=-ds;y<ds;y+=2,putchar('\n'))
           {
            for(int X=0;X<TX;++X)
              {
               for(int x=-ds;x<ds;x+=2)
                 {
                  int v=abs(y+1)+abs(x+1);
                  putchar(tb[((((v<ds)<<1)|(v>ds))<<1)|((y<0)^(x<0))]);
                 }
              }
           }
        }
     }
   return 0;
  }
endlesik napisał(a):

... np.

tb[ ((((v<ds) << 1) | (v>ds)) << 1) | ((y<0) ^ (x<0)) ];

Mów konkretnie czego nie rozumiesz:

  1. <
  2. >
  3. |
  4. ^
  5. <<
  6. Czy może indeksacji tablicy: tb[index]
0

Już wszystko jasne.. operacji bitowych jeszcze się nie uczyłem.. będę musiał się w to wgryźć. Dzięki :)

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