找试场——世上无难题,只要肯思考_耀晨SYW

来源:互联网 发布:下载手机app软件 编辑:程序博客网 时间:2024/05/08 10:33

【未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!未经作者同意,不许转载!!!!!!】

【讨论加我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.

0 2
原创粉丝点击