#include <stdio.h>
/*
(2w+2h-4)/0 1 .. w-2 w-1
+---------------+
2w+2h-5 | | w
. | | .
. | | .
. | | .
2w+h-2 | | w+h-3
+---------------+
2w+h-3 2w+h-4 .. w+h-1 w+h-2
*/
int EnvelopeLength( int w, int h)
{
if ( w <= 0 || h <= 0 )
return 0 ;
if ( h == 1 )
return w;
if ( w == 1 )
return h;
return 2 * ( w + h) - 4 ;
}
#if 0 // this function is currently unused
int Coords2EnvelopePosition( int x, int y, int w, int h)
{
int pos = - 1 ;
if ( w <= 0 || h <= 0 )
pos = - 1 ;
else if ( w == 1 && h == 1 )
pos = 0 ;
else if ( h == 1 )
pos = x;
else if ( w == 1 )
pos = y;
else if ( y == 0 )
pos = x;
else if ( x == w - 1 )
pos = w + y - 1 ;
else if ( y == h - 1 )
pos = 2 * w + h - x - 3 ;
else if ( x == 0 )
pos = 2 * w + 2 * h - y - 4 ;
return pos;
}
#endif
void EnvelopePosition2Coords( int * px, int * py, int w, int h, int pos)
{
* py = * px = - 1 ;
if ( w <= 0 || h <= 0 )
* py = * px = - 1 ;
else if ( w == 1 && h == 1 )
* py = * px = 0 ;
else if ( h == 1 )
* px = pos, * py = 0 ;
else if ( w == 1 )
* px = 0 , * py = pos;
else if ( pos < w)
* px = pos, * py = 0 ;
else if ( pos <= w + h - 2 )
* px = w - 1 , * py = pos - w + 1 ;
else if ( pos <= 2 * w + h - 3 )
* px = 2 * w + h - 3 - pos, * py = h - 1 ;
else if ( pos <= 2 * w + 2 * h - 5 )
* px = 0 , * py = 2 * w + 2 * h - 4 - pos;
}
void SpiralShift( char * a, int w, int h)
{
int w0 = w;
while ( w > 0 && h > 0 )
{
int len = EnvelopeLength( w, h) , pos;
int xto, yto, xfrom, yfrom;
for ( pos = 0 ; pos < len - 1 ; pos++ )
{
EnvelopePosition2Coords( & xto, & yto, w, h, pos) ;
EnvelopePosition2Coords( & xfrom, & yfrom, w, h, pos + 1 ) ;
a[ yto * w0 + xto] = a[ yfrom * w0 + xfrom] ;
}
EnvelopePosition2Coords( & xto, & yto, w, h, len - 1 ) ;
if ( w > 2 && h > 2 )
{
EnvelopePosition2Coords( & xfrom, & yfrom, w - 2 , h - 2 , 0 ) ;
a[ yto * w0 + xto] = a[ w0 + 1 + yfrom * w0 + xfrom] ;
w -= 2 ;
h -= 2 ;
a += w0 + 1 ;
}
else
{
a[ yto * w0 + xto] = ' ' ;
break ;
}
}
}
void PrintSpiral( const char * s, int w, int h)
{
int x, y;
for ( y = 0 ; y < h; y++ )
{
for ( x = 0 ; x < w; x++ )
}
}
int main( void )
{
char spiral1x1[ 1 * 1 ] =
"a" ;
char spiral2x2[ 2 * 2 ] =
"wo"
"dr" ;
char spiral5x6[ 5 * 6 ] =
"This i"
"ing ss"
"lce.e "
"lnetna"
"arips " ;
int i;
PrintSpiral( spiral1x1, 1 , 1 ) ;
for ( i = 0 ; i < 1 * 1 ; i++ )
{
SpiralShift( spiral1x1, 1 , 1 ) ;
PrintSpiral( spiral1x1, 1 , 1 ) ;
}
PrintSpiral( spiral2x2, 2 , 2 ) ;
for ( i = 0 ; i < 2 * 2 ; i++ )
{
SpiralShift( spiral2x2, 2 , 2 ) ;
PrintSpiral( spiral2x2, 2 , 2 ) ;
}
PrintSpiral( spiral5x6, 6 , 5 ) ;
for ( i = 0 ; i < 5 * 6 ; i++ )
{
SpiralShift( spiral5x6, 6 , 5 ) ;
PrintSpiral( spiral5x6, 6 , 5 ) ;
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovKgogICgydysyaC00KS8wICAxICAgICAuLiAgICB3LTIgIHctMQogICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rIAogICAgICAydysyaC01IHwgICAgICAgICAgICAgICB8IHcKICAgICAgICAgICAgLiB8ICAgICAgICAgICAgICAgfCAuCiAgICAgICAgICAgIC4gfCAgICAgICAgICAgICAgIHwgLgogICAgICAgICAgICAuIHwgICAgICAgICAgICAgICB8IC4KICAgICAgIDJ3K2gtMiB8ICAgICAgICAgICAgICAgfCB3K2gtMwogICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCiAgICAgICAydytoLTMgIDJ3K2gtNCAuLiB3K2gtMSAgdytoLTIKKi8KCmludCBFbnZlbG9wZUxlbmd0aChpbnQgdywgaW50IGgpCnsKICBpZiAodyA8PSAwIHx8IGggPD0gMCkKICAgIHJldHVybiAwOwoKICBpZiAoaCA9PSAxKQogICAgcmV0dXJuIHc7CgogIGlmICh3ID09IDEpCiAgICByZXR1cm4gaDsKCiAgcmV0dXJuIDIgKiAodyArIGgpIC0gNDsKfQoKI2lmIDAgLy8gdGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgdW51c2VkCmludCBDb29yZHMyRW52ZWxvcGVQb3NpdGlvbihpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKewogIGludCBwb3MgPSAtMTsKICBpZiAodyA8PSAwIHx8IGggPD0gMCkKICAgIHBvcyA9IC0xOwogIGVsc2UgaWYgKHcgPT0gMSAmJiBoID09IDEpCiAgICBwb3MgPSAwOwogIGVsc2UgaWYgKGggPT0gMSkKICAgIHBvcyA9IHg7CiAgZWxzZSBpZiAodyA9PSAxKQogICAgcG9zID0geTsKICBlbHNlIGlmICh5ID09IDApCiAgICBwb3MgPSB4OwogIGVsc2UgaWYgKHggPT0gdyAtIDEpCiAgICBwb3MgPSB3ICsgeSAtIDE7CiAgZWxzZSBpZiAoeSA9PSBoIC0gMSkKICAgIHBvcyA9IDIgKiB3ICsgaCAtIHggLSAzOwogIGVsc2UgaWYgKHggPT0gMCkKICAgIHBvcyA9IDIgKiB3ICsgMiAqIGggLSB5IC0gNDsKICByZXR1cm4gcG9zOwp9CiNlbmRpZgoKdm9pZCBFbnZlbG9wZVBvc2l0aW9uMkNvb3JkcyhpbnQqIHB4LCBpbnQqIHB5LCBpbnQgdywgaW50IGgsIGludCBwb3MpCnsKICAqcHkgPSAqcHggPSAtMTsKICBpZiAodyA8PSAwIHx8IGggPD0gMCkKICAgICpweSA9ICpweCA9IC0xOwogIGVsc2UgaWYgKHcgPT0gMSAmJiBoID09IDEpCiAgICAqcHkgPSAqcHggPSAwOwogIGVsc2UgaWYgKGggPT0gMSkKICAgICpweCA9IHBvcywgKnB5ID0gMDsKICBlbHNlIGlmICh3ID09IDEpCiAgICAqcHggPSAwLCAqcHkgPSBwb3M7CiAgZWxzZSBpZiAocG9zIDwgdykKICAgICpweCA9IHBvcywgKnB5ID0gMDsKICBlbHNlIGlmIChwb3MgPD0gdyArIGggLSAyKQogICAgKnB4ID0gdyAtIDEsICpweSA9IHBvcyAtIHcgKyAxOwogIGVsc2UgaWYgKHBvcyA8PSAyICogdyArIGggLSAzKQogICAgKnB4ID0gMiAqIHcgKyBoIC0gMyAtIHBvcywgKnB5ID0gaCAtIDE7CiAgZWxzZSBpZiAocG9zIDw9IDIgKiB3ICsgMiAqIGggLSA1KQogICAgKnB4ID0gMCwgKnB5ID0gMiAqIHcgKyAyICogaCAtIDQgLSBwb3M7Cn0KCnZvaWQgU3BpcmFsU2hpZnQoY2hhciogYSwgaW50IHcsIGludCBoKQp7CiAgaW50IHcwID0gdzsKCiAgd2hpbGUgKHcgPiAwICYmIGggPiAwKQogIHsKICAgIGludCBsZW4gPSBFbnZlbG9wZUxlbmd0aCh3LCBoKSwgcG9zOwogICAgaW50IHh0bywgeXRvLCB4ZnJvbSwgeWZyb207CgogICAgZm9yIChwb3MgPSAwOyBwb3MgPCBsZW4gLSAxOyBwb3MrKykKICAgIHsKICAgICAgRW52ZWxvcGVQb3NpdGlvbjJDb29yZHMoJnh0bywgJnl0bywgdywgaCwgcG9zKTsKICAgICAgRW52ZWxvcGVQb3NpdGlvbjJDb29yZHMoJnhmcm9tLCAmeWZyb20sIHcsIGgsIHBvcyArIDEpOwogICAgICBhW3l0byAqIHcwICsgeHRvXSA9IGFbeWZyb20gKiB3MCArIHhmcm9tXTsKICAgIH0KCiAgICBFbnZlbG9wZVBvc2l0aW9uMkNvb3JkcygmeHRvLCAmeXRvLCB3LCBoLCBsZW4gLSAxKTsKCiAgICBpZiAodyA+IDIgJiYgaCA+IDIpCiAgICB7CiAgICAgIEVudmVsb3BlUG9zaXRpb24yQ29vcmRzKCZ4ZnJvbSwgJnlmcm9tLCB3IC0gMiwgaCAtIDIsIDApOwogICAgICBhW3l0byAqIHcwICsgeHRvXSA9IGFbdzAgKyAxICsgeWZyb20gKiB3MCArIHhmcm9tXTsKICAgICAgdyAtPSAyOwogICAgICBoIC09IDI7CiAgICAgIGEgKz0gdzAgKyAxOwogICAgfQogICAgZWxzZQogICAgewogICAgICBhW3l0byAqIHcwICsgeHRvXSA9ICcgJzsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cgp2b2lkIFByaW50U3BpcmFsKGNvbnN0IGNoYXIqcywgaW50IHcsIGludCBoKQp7CiAgaW50IHgsIHk7CiAgcHV0cygiU3BpcmFsOiIpOwogIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspCiAgewogICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKICAgICAgcHJpbnRmKCIlYyAiLCBzW3kgKiB3ICsgeF0pOwogICAgcHV0cygiIik7CiAgfQogIHB1dHMoIiIpOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgY2hhciBzcGlyYWwxeDFbMSAqIDFdID0KICAgICJhIjsKICBjaGFyIHNwaXJhbDJ4MlsyICogMl0gPQogICAgIndvIgogICAgImRyIjsKICBjaGFyIHNwaXJhbDV4Nls1ICogNl0gPQogICAgIlRoaXMgaSIKICAgICJpbmcgc3MiCiAgICAibGNlLmUgIgogICAgImxuZXRuYSIKICAgICJhcmlwcyAiOwogIGludCBpOwoKICBQcmludFNwaXJhbChzcGlyYWwxeDEsIDEsIDEpOwogIGZvciAoaSA9IDA7IGkgPCAxICogMTsgaSsrKQogIHsKICAgIFNwaXJhbFNoaWZ0KHNwaXJhbDF4MSwgMSwgMSk7CiAgICBQcmludFNwaXJhbChzcGlyYWwxeDEsIDEsIDEpOwogIH0KCiAgUHJpbnRTcGlyYWwoc3BpcmFsMngyLCAyLCAyKTsKICBmb3IgKGkgPSAwOyBpIDwgMiAqIDI7IGkrKykKICB7CiAgICBTcGlyYWxTaGlmdChzcGlyYWwyeDIsIDIsIDIpOwogICAgUHJpbnRTcGlyYWwoc3BpcmFsMngyLCAyLCAyKTsKICB9CgogIFByaW50U3BpcmFsKHNwaXJhbDV4NiwgNiwgNSk7CiAgZm9yIChpID0gMDsgaSA8IDUgKiA2OyBpKyspCiAgewogICAgU3BpcmFsU2hpZnQoc3BpcmFsNXg2LCA2LCA1KTsKICAgIFByaW50U3BpcmFsKHNwaXJhbDV4NiwgNiwgNSk7CiAgfQogIHJldHVybiAwOwp9Cg==