HUT OJ 1567 折纸
http://openoj.awaysoft.com/JudgeOnline/problem.php?id=1567
该题是一道纯模拟题,这道题比较好的解法就是用二维栈,因为每次被折的栈里面的元素都要反过来,这与栈的特性FILO是一样的,可以用栈来就行模拟。
#include<stdio.h>
#include<stdlib.h>
typedef struct s
{
int x,y;
}POS;
struct tt
{
POS link[450];
int top;
}map[24][24];
int top,down,right,left;
void T_ZHE()
{
for( int i=left;i<=right;i++ )
while( map[top][i].top )
{
++map[top+1][i].top;
map[top+1][i].link[map[top+1][i].top].x=map[top][i].link[map[top][i].top].x;
map[top+1][i].link[map[top+1][i].top].y=map[top][i].link[map[top][i].top].y;
map[top][i].top--;
}
top++;
}
void B_ZHE()
{
for( int i=left;i<=right;i++ )
while( map[down][i].top )
{
++map[down-1][i].top;
map[down-1][i].link[map[down-1][i].top].x=map[down][i].link[map[down][i].top].x;
map[down-1][i].link[map[down-1][i].top].y=map[down][i].link[map[down][i].top].y;
map[down][i].top--;
}
down--;
}
void R_ZHE()
{
for( int i=top;i<=down;i++ )
while( map[i][right].top )
{
++map[i][right-1].top;
map[i][right-1].link[map[i][right-1].top].x=map[i][right].link[map[i][right].top].x;
map[i][right-1].link[map[i][right-1].top].y=map[i][right].link[map[i][right].top].y;
map[i][right].top-- ;
}
right--;
}
void L_ZHE()
{
for( int i=top;i<=down;i++ )
while( map[i][left].top )
{
++map[i][left+1].top;
map[i][left+1].link[map[i][left+1].top].x=map[i][left].link[map[i][left].top].x;
map[i][left+1].link[map[i][left+1].top].y=map[i][left].link[map[i][left].top].y;
map[i][left].top-- ;
}
left++;
}
int main( )
{
int m,n,w=1;
char c[50];
while( scanf( "%d%d",&n,&m ),m||n )
{
int t=m+n-2;
if( t )
{
top=1,down=n,right=m,left=1;
scanf( "%s",c );
for( int i=1;i<=n; i++ )
for( int j=1; j<=m; j++ )
{
map[i][j].top=1;
map[i][j].link[ 1 ].x=i;
map[i][j].link[ 1 ].y=j;
}
for( int i=0;i<t;i++ )
{
if( c[i]=='L' )
L_ZHE( );
if( c[i]=='R' )
R_ZHE( );
if( c[ i ]=='T' )
T_ZHE();
if( c[ i ]=='B' )
B_ZHE();
}
printf( "case %d:\n",w );
for(int k=1; k<=map[top][left].top;k++ )
{
printf( "%d %d\n",map[top][left].link[k].x,map[top][left].link[k].y ) ;
}
}
else
{
printf( "case %d:\n",w );
printf( "%d %d\n",n,m );
}
w++;
}
return 0;
}