Code: Select all
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
string direction[10]={"N","NE","E","SE","S","SW","W","NW"};
int dir_x[]={0,1,1,1,0,-1,-1,-1};
int dir_y[]={1,1,0,-1,-1,-1,0,1};
int cx,cy,cdir;
char order[100];
int state1,state2;
void GO(int k)
{
cx+=k*dir_x[cdir];
cy+=k*dir_y[cdir];
}
bool LEAVE_VALIDITY(int x,int y,int turn)
{
if(state1==-1)
return (turn==6);
else
return (turn==5);
}
bool ARRIVE_VALIDITY(int x,int y,int turn)
{
if(state2==-1)
return (turn==6);
else
return (turn==5);
}
bool DIR_VALIDITY(int x,int y,int dir)
{
if(x==0 && y==0)
return true;
if(x==50 && y==50)
return (dir==5 || dir==6 || dir==4);
if(x==50 && y==0)
return (dir==7 || dir==5 || dir==0 || dir==4 || dir==6);
if(x==50 && y==-50)
return (dir==7 || dir==0 || dir==6);
if(x==0 && y==50)
return (dir==3 || dir==5 || dir==2 || dir==4 || dir==6);
if(x==0 && y==-50)
return (dir==1 || dir==7 || dir==2 || dir==0 || dir==6);
if(x==-50 && y==50)
return (dir==3 || dir==2 || dir==4);
if(x==-50 && y==0)
return (dir==1 && dir==3 || dir==0 || dir==2 || dir==4);
if(x==-50 && y==-50)
return (dir==1 || dir==0 || dir==2);
if((x-y==0 || x-y==-50 || x-y==50) && (dir==1 || dir==5))
return true;
if((x+y==0 || x+y==50 || x+y==-50) && (dir==7 || dir==3))
return true;
if(dir==0 || dir==2 || dir==4 || dir==6)
return true;
return false;
}
//return negetive if gray. -1 if ||x or y else -2. and other case 1.
int BOULVARD(int x,int y,int dir)
{
if( (y==50 || y==0 || y==-50) && (dir==2 || dir==6))
return -1;
if( (x==50 || x==0 || x==-50) && (dir==0 || dir==4))
return -1;
if(x+y==0 && (dir==7 || dir==3))
return -2;
if(x-y==0 && (dir==1 || dir==5))
return -2;
return 1;
}
bool CIRCLE(int x,int y)
{
if((x==-50 || x==0 || x==50) && (y==-50 || y==0 || y==50))
return true;
return false;
}
void TURN(int k)
{
bool xx;
if(!DIR_VALIDITY(cx+dir_x[cdir],cy+dir_y[cdir],(cdir+k)%8))
return;
state1=BOULVARD(cx+dir_x[cdir],cy+dir_y[cdir],cdir);//
state2=BOULVARD(cx+dir_x[cdir],cy+dir_y[cdir],(cdir+k)%8);
if(state1<0 && state2>0)
xx= LEAVE_VALIDITY(cx+dir_x[cdir],cy+dir_y[cdir],k);
else if(state1>0 && state2<0)
xx=ARRIVE_VALIDITY(cx+dir_x[cdir],cy+dir_y[cdir],k);
else
xx=true;
if(xx || CIRCLE(cx+dir_x[cdir],cy+dir_y[cdir]))
{
cx+=dir_x[cdir];
cy+=dir_y[cdir];
cdir=(cdir+k)%8;
}
}
void DECODE()
{
char msg1[100],msg2[100],msg3[100];
int d,turn,type;
sscanf(order,"%s",msg1);
if(strcmp(msg1,"GO")==0)
{
sscanf(order,"%s%s",msg1,msg2);
if(msg2[0]>='0' && msg2[0]<='9')
sscanf(order,"%s%d",msg1,&d);
else
{
sscanf(order,"%s%s%d",msg1,msg2,&d);
if(strcmp(msg2,"STARIGHT")!=0)
return;
}
GO(d);
}
else if(strcmp(msg1,"TURN")==0)
{
sscanf(order,"%s%s",msg1,msg2);
if(strcmp(msg2,"LEFT")==0 || strcmp(msg2,"RIGHT")==0)
type=2;
else
{
sscanf(order,"%s%s%s",msg1,msg2,msg3);
type=3;
}
if(type==2 && strcmp(msg2,"LEFT")==0)
turn=6;
else if(type==2 && strcmp(msg2,"RIGHT")==0)
turn=2;
else if(type==3 && strcmp(msg2,"SHARP")==0 && strcmp(msg3,"LEFT")==0)
turn=5;
else if(type==3 && strcmp(msg2,"SHARP")==0 && strcmp(msg3,"RIGHT")==0)
turn=3;
else if(type==3 && strcmp(msg2,"HALF")==0 && strcmp(msg3,"LEFT")==0)
turn=7;
else if(type==3 && strcmp(msg2,"HALF")==0 && strcmp(msg3,"RIGHT")==0)
turn=1;
else
return;
TURN(turn);
}
}
void PRINT()
{
printf("A%d%c",cx*(cx<0 ? -1:1),(cx<0 ? 'W' : 'E'));
printf(" S%d%c",cy*(cy<0 ? -1:1),(cy<0 ? 'S' : 'N'));
printf(" %s\n",direction[cdir].c_str());
}
void RESULT()
{
int OK=1;
OK=BOULVARD(cx,cy,cdir);
//printf(">>>>>>>>>>>>>");
if(OK>0)
PRINT();
else
printf("Illegal stopping place\n");
}
int main()
{
char order1[100],order2[100];
char AOS,dir;
int d,i;
while(scanf("%s",order)!=EOF)
{
if(strcmp(order,"END")==0)
break;
scanf("%s%s%c",order1,order2,&AOS);
sscanf(order,"%c%d%c",&AOS,&d,&dir);
if(AOS=='A')
cx=d*(dir=='W' ? -1:1);
else
cy=d*(dir=='S' ? -1:1);
sscanf(order1,"%c%d%c",&AOS,&d,&dir);
if(AOS=='A')
cx=d*(dir=='W' ? -1:1);
else
cy=d*(dir=='S' ? -1:1);
for(i=0;i<8;i++)
if(order2==direction[i])
cdir=i;
while(gets(order))
{
if(strcmp(order,"STOP")==0)
break;
DECODE();
// printf(">>%d %d %d\n",cx,cy,cdir);
}
RESULT();
}
return 0;
}
Getting Wa. can any one help?