SLIDE1

Sunday, April 19, 2015

[C++] điều khiển robot trong bản đồ Oxy U-D-L-R-T-B


Robot đang đứng ở vị trí 0 0 trong bản đồ. Robot có thể nhận các lệnh L: về phía bên trái, R: về bên phải, U: tiến về phía trước, D: lùi ra sau, B: quay lại vị trí trước đó (lưu ý, nếu robot đã thực hiện lênh U, R, sau đó nhận lệnh B, B thì robot sẽ thực hiện lệnh L, D, còn nếu robot chưa thực hiện lệnh nào thì lệnh B sẽ không có tác dụng) và lệnh T (turn around, lệnh này sẽ đọc thêm lệnh tiếp theo và khiến robot quay 180 độ về phía sau nếu lệnh tiếp theo là D, quay 90 độ theo kim đồng hồ nếu lệnh tiếp theo là R, quay 90 độ ngược kim đồng hồ nếu lệnh tiếp theo là L, khiến robot đứng yên không di chuyển nếu lệnh tiếp theo là B hay U.)
Ban đầu robot đang quay lên trên
Hãy tìm tọa độ của robot sau khi thực hiện xong n chuỗi lệnh. (robot sẽ vẫn giữ nguyên vị trí và hướng quay sau khi thực hiện xong 1 chuỗi lệnh)
Input
N (N<100)
N dòng, mỗi dòng là 1 chuỗi lệnh cho robot (mỗi dòng <255 kí tự)
(40% test sẽ không có lệnh T)
Output
N dòng, mỗi dòng là tọa độ robot sau khi thực hiện chuỗi lệnh của dòng tương ứng
Ví Dụ:
Input:
4
UDLRTBBBBTUTRTLTDU
UUUU
TLUUUU
BBBB
Output:
0 0
0 -4
4 -4
0 -4

#include<iostream>
using namespace std;
struct diem{int x,y,z;};
void tinh(char *s,diem &x,char *a,int &j)
{
int i=0;
while(i<strlen(s))
{
if(s[i]=='U')
{
if(x.z==0)
{
x.y++;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.x++;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.y--;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.x--;
a[j++]=s[i++];
}
}
else if(s[i]=='D')
{
if(x.z==0)
{
x.y--;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.x--;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.y++;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.x++;
a[j++]=s[i++];
}
}
else if(s[i]=='L')
{
if(x.z==0)
{
x.x--;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.y++;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.x++;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.y--;
a[j++]=s[i++];
}
}
else if(s[i]=='R')
{
if(x.z==0)
{
x.x++;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.y--;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.x--;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.y++;
a[j++]=s[i++];
}
}
else if(s[i]=='T')
{
if(s[i+1]=='B' || s[i+1]=='U') i=i+2;
else
{
i++;
if(s[i]=='L')
{
x.z--;
if(x.z==-1) x.z=3;
}
else if(s[i]=='R')
{
x.z++;
if(x.z==4) x.z=0;
}
else if(s[i]=='D') x.z=(x.z+2)%4;
i++;
}
}
else if(s[i]=='B')
{
if(j==0) i++;
else if(j>0)
{
j--;
if(a[j]=='U')
{
if(x.z==0)
{
x.y--;
i++;

}
else if(x.z==1)
{
x.x--;
i++;

}
else if(x.z==2)
{
x.y++;
i++;

}
else if(x.z==3)
{
x.x++;
i++;

}
}
else if(a[j]=='D')
{
if(x.z==0)
{
x.y++;
i++;

}
else if(x.z==1)
{
x.x++;
i++;

}
else if(x.z==2)
{
x.y--;
i++;

}
else if(x.z==3)
{
x.x--;
i++;

}
}
else if(a[j]=='L')
{
if(x.z==0)
{
x.x++;
i++;

}
else if(x.z==1)
{
x.y--;
i++;

}
else if(x.z==2)
{
x.x--;
i++;

}
else if(x.z==3)
{
x.y++;
i++;

}
}
else if(a[j]=='R')
{
if(x.z==0)
{
x.x--;
i++;

}
else if(x.z==1)
{
x.y++;
i++;

}
else if(x.z==2)
{
x.x++;
i++;

}
else if(x.z==3)
{
x.y--;
i++;
}
}
}
}
else i++;
}
}
void main()
{
FILE *t1=fopen("bai2.inp","r");
FILE *t2=fopen("bai2.out","w");
if(t1==NULL || t2==NULL) exit(0);
char s[300],a[300];
int i,n,j=0;
fgets(s,4,t1);
n=atoi(s);
diem x;
x.x=x.y=x.z=0;
for(i=0;i<n;i++)
{
fgets(s,300,t1);
tinh(s,x,a,j);
fprintf(t2,"%d %d\n",x.x,x.y);
}
fcloseall();

}