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;    

}

posted @ 2011-08-03 18:55  wutaoKeen  阅读(334)  评论(0编辑  收藏  举报