733 - Follow the Folding Dot
Posted: Wed Jun 19, 2002 3:57 pm
#include <iostream>
#include <cmath>
using namespace std;
int refreshPos(double dimX, double dimY, double x, double y, char InitialPos){
double half_dimX=dimX/2;
double half_dimY=dimY/2;
if(x<half_dimX && y<half_dimY && InitialPos=='T')
return 1;
if(x>half_dimX && y<half_dimY && InitialPos=='T')
return 2;
if(x<half_dimX && y>half_dimY && InitialPos=='T')
return 3;
if(x>half_dimX && y>half_dimY && InitialPos=='T')
return 4;
if(x<half_dimX && y<half_dimY && InitialPos=='B')
return 5;
if(x>half_dimX && y<half_dimY && InitialPos=='B')
return 6;
if(x<half_dimX && y>half_dimY && InitialPos=='B')
return 7;
if(x>half_dimX && y>half_dimY && InitialPos=='B')
return 8;
return 0;
}
void main(){
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(6);
unsigned long paper=1;
while(true){
double x,y,dimX,dimY;
char command1, command2, InitialPos;
int dotPos=0;
unsigned long page=1;
if(!(cin>>dimX))
break;
cin>>dimY;
cin>>x>>y>>InitialPos;
dotPos=refreshPos(dimX,dimY,x,y,InitialPos);
page=1;
int count=0;
cout<<"Paper number "<<paper<<endl;
cout<<"Beginning paper dimensions "<<dimX<< " X " <<dimY<<endl;
cout<<"Dot is on ";
if(InitialPos=='T')
cout<<"TOP";
else cout<<"BOTTOM";
cout<<" of page "<<page<<". Position "<<x<<" X "<<y<<endl;
cout<<endl;
while(cin>>command1){
dotPos=refreshPos(dimX,dimY,x,y,InitialPos);
if(command1=='S')
break;
cin>>command2;
// Calc. new dimension
if(command1=='L' || command1=='R')
dimX/=2;
else dimY/=2;
if(command1=='L'){
if(command2=='U'){
switch(dotPos){
case 1:
case 3:
case 5:
case 7: x=dimX-x;
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: x-=dimX;
}
}else
if(command2=='O'){
switch(dotPos){
case 1:
case 3:
case 5:
case 7:
x=dimX-x;
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: x-=dimX;
page+=pow(2,count);
}
}
}
if(command1=='R'){
if(command2=='U'){
switch(dotPos){
case 2:
case 4:
case 6:
case 8:
x=dimX-(x-dimX);
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: ;
}
}else
if(command2=='O'){
switch(dotPos){
case 2:
case 4:
case 6:
case 8: x=dimX-(x-dimX);
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: page+=pow(2,count);
}
}
}
if(command1=='T'){
if(command2=='U'){
switch(dotPos){
case 1:
case 2:
case 5:
case 6: y=dimY-y;
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: y-=dimY;
}
}else
if(command2=='O'){
switch(dotPos){
case 1:
case 2:
case 5:
case 6: y=dimY-y;
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: y-=dimY;
page+=pow(2,count);
}
}
}
if(command1=='B'){
if(command2=='U'){
switch(dotPos){
case 3:
case 4:
case 7:
case 8: y=dimY-(y-dimY);
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: ;
}
}else
if(command2=='O'){
switch(dotPos){
case 3:
case 4:
case 7:
case 8: y=dimY-(y-dimY);
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: page+=pow(2,count);
}
}
}
count++;
}
cout<<"After folding paper. Paper dimensions: "<<dimX<< " X " <<dimY<<endl;
cout<<"Dot is on ";
if(InitialPos=='T')
cout<<"TOP";
else cout<<"BOTTOM";
cout<<" of page "<<page<<". Position "<<x<<" X "<<y<<endl;
cout<<endl;
paper++;
}
}[cpp][/cpp]
#include <cmath>
using namespace std;
int refreshPos(double dimX, double dimY, double x, double y, char InitialPos){
double half_dimX=dimX/2;
double half_dimY=dimY/2;
if(x<half_dimX && y<half_dimY && InitialPos=='T')
return 1;
if(x>half_dimX && y<half_dimY && InitialPos=='T')
return 2;
if(x<half_dimX && y>half_dimY && InitialPos=='T')
return 3;
if(x>half_dimX && y>half_dimY && InitialPos=='T')
return 4;
if(x<half_dimX && y<half_dimY && InitialPos=='B')
return 5;
if(x>half_dimX && y<half_dimY && InitialPos=='B')
return 6;
if(x<half_dimX && y>half_dimY && InitialPos=='B')
return 7;
if(x>half_dimX && y>half_dimY && InitialPos=='B')
return 8;
return 0;
}
void main(){
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(6);
unsigned long paper=1;
while(true){
double x,y,dimX,dimY;
char command1, command2, InitialPos;
int dotPos=0;
unsigned long page=1;
if(!(cin>>dimX))
break;
cin>>dimY;
cin>>x>>y>>InitialPos;
dotPos=refreshPos(dimX,dimY,x,y,InitialPos);
page=1;
int count=0;
cout<<"Paper number "<<paper<<endl;
cout<<"Beginning paper dimensions "<<dimX<< " X " <<dimY<<endl;
cout<<"Dot is on ";
if(InitialPos=='T')
cout<<"TOP";
else cout<<"BOTTOM";
cout<<" of page "<<page<<". Position "<<x<<" X "<<y<<endl;
cout<<endl;
while(cin>>command1){
dotPos=refreshPos(dimX,dimY,x,y,InitialPos);
if(command1=='S')
break;
cin>>command2;
// Calc. new dimension
if(command1=='L' || command1=='R')
dimX/=2;
else dimY/=2;
if(command1=='L'){
if(command2=='U'){
switch(dotPos){
case 1:
case 3:
case 5:
case 7: x=dimX-x;
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: x-=dimX;
}
}else
if(command2=='O'){
switch(dotPos){
case 1:
case 3:
case 5:
case 7:
x=dimX-x;
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: x-=dimX;
page+=pow(2,count);
}
}
}
if(command1=='R'){
if(command2=='U'){
switch(dotPos){
case 2:
case 4:
case 6:
case 8:
x=dimX-(x-dimX);
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: ;
}
}else
if(command2=='O'){
switch(dotPos){
case 2:
case 4:
case 6:
case 8: x=dimX-(x-dimX);
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: page+=pow(2,count);
}
}
}
if(command1=='T'){
if(command2=='U'){
switch(dotPos){
case 1:
case 2:
case 5:
case 6: y=dimY-y;
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: y-=dimY;
}
}else
if(command2=='O'){
switch(dotPos){
case 1:
case 2:
case 5:
case 6: y=dimY-y;
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: y-=dimY;
page+=pow(2,count);
}
}
}
if(command1=='B'){
if(command2=='U'){
switch(dotPos){
case 3:
case 4:
case 7:
case 8: y=dimY-(y-dimY);
page=(pow(2,count)-page+1)+pow(2,count);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: ;
}
}else
if(command2=='O'){
switch(dotPos){
case 3:
case 4:
case 7:
case 8: y=dimY-(y-dimY);
page=(pow(2,count)-page+1);
if( InitialPos == 'T' )
InitialPos='B';
else InitialPos='T';
break;
default: page+=pow(2,count);
}
}
}
count++;
}
cout<<"After folding paper. Paper dimensions: "<<dimX<< " X " <<dimY<<endl;
cout<<"Dot is on ";
if(InitialPos=='T')
cout<<"TOP";
else cout<<"BOTTOM";
cout<<" of page "<<page<<". Position "<<x<<" X "<<y<<endl;
cout<<endl;
paper++;
}
}[cpp][/cpp]