【未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!】
【讨论加我QQ:1721324995 讨论加我QQ:1721324995 讨论加我QQ:1721324995 非诚勿扰!非诚勿扰!非诚勿扰!】
思路:
上来直接暴力。
但是,暴力也是要有技术的。比如在刚刚过去的NOIP,因为暴力没打好的我从320降到270(╯﹏╰)。这一题主要思路是:读入字符串,判断是否是数字。如果是,则按现方向行进;否则,是right则方向向右,是left则方向向左。其中最难处理的是转向,就连老师讲的这题的题解,都十分麻烦,甚至要用10多行来处理转x向。我琢磨一下,想到二维搜索中的ty和tx(有些人不习惯用ty、tx,直接是在x、y后面加减,建议大家用tx、ty)。但是在这里,下标是个麻烦事儿。
比如当k(tx和ty的下标)为3,转向指令为右(这里我写的应为k+1)时,(k+1)mod 4=0!因此我想到一种方法:把tx、ty的数组界限改为0..3(见下图法一)。然而我似乎是个死脑筋,应又试出了一种方法(见下图法二)。
(法一) (法二)
也是很可以啊,两种方法都AC了(此处应有掌声)!不知我是怎么想出来的,总之一定花了不少脑筋。这灵验了沃仔基(我自己)的话:“世上无难题,只要肯思考。”
下面上AC程序(此程序用的是法二):
const
tx:array[1..4]of longint=(0,1,0,-1);
ty:array[1..4]of longint=(1,0,-1,0);
var
i,n,t,x,y,k:longint;
st:string;flag:boolean;
begin
readln(n);t:=1;flag:=true;
for i:=1 to n do begin
readln(st);
if (st[1]>='0')and(st[1]<='9') then begin
val(st,k);
x:=x+k*tx[t];y:=y+k*ty[t];
writeln('(',x,',',y,')');flag:=false;
end
else begin
if st[1]='r' then t:=t mod 4+1 else t:=(t+2)mod 4+1;
end;
end;
if flag then write('(0,0)');
end.