没道理啊,为何WA(先不管TLE)

P1724 东风谷早苗

最好不要使用gets,因为它在Linux环境(洛谷就是Linux环境)下会多读一些东西。 我AC之后的代码: ```cpp #include<iostream> #include<cstdio> #include<cstring> using namespace std; int i; long long int t,cl; char command[5005]; //对象钢达姆模型 struct dmF{ //属性只有坐标而已 long long int x,y; }dm; //对象:移动一个周期之后所在的位置 struct posF{ long long int x,y; }pos; //让钢达姆模型移动 void move(){ switch(command[i]){ case 'E': dm.x++; break; case 'S': dm.y--; break; case 'W': dm.x--; break; case 'N': dm.y++; } } //让钢达姆模型移动许多个周期,直到剩下的移动次数小于移动一个周期所需要的移动次数为止(just like fly) void fly(){ //当t小于移动一个周期所需要的次数时就打断循环,否则就让它一直飞 while(t > cl){ //移动一个周期之后的位置 dm.x += pos.x; dm.y += pos.y; //移动的次数减少 t -= cl; } } int main(){ //得到命令串 scanf("%s",command); //得到总共行走的时间 scanf("%lld",&t); //得到命令串的长度 cl = strlen(command); //得到钢达姆模型移动了一个周期之后所在的位置 //移动一个周期(也就是移动命令串的长度次) for(i=0;i<cl;i++){ //让钢达姆模型移动(此时应该移动的是pos对象而不是真正的钢达姆模型对象dm) move(); } //保存钢达姆模型此时的位置 pos.x = dm.x; pos.y = dm.y; //让钢达姆模型回到原来的位置(刚才只是测试而已,但调用move函数就代表改变了dm对象的坐标) dm.x = dm.y = 0; //飞 fly(); //剩下的次数好好一步一步循环 for(i=0;i<t;i++){ move(); } //输出坐标 printf("%lld %lld",dm.x,dm.y); return 0; } ```
by 黑猫_琉璃 @ 2018-08-25 22:28:47


@[俞科chen21](/space/show?uid=56090) 刚才以为这么长的一段回复没有了,既然还在就再发一遍。 呜额……首先,建议日后做题代码写注释,这样自己的逻辑会更加清楚(帮你调错的人也能瞬间get到关键点)。 其次,建议不要使用gets()函数,因为它在Linux的运行环境(洛谷就是Linux运行环境)之下会多读一点东西,而scanf就没有这样的问题啦。所以建议你这样写: ```cpp scanf("%s",c); ``` 你的样例过了吗?你有下载过第一个测试点的数据然后在本机上测试过吗?如果有,并且本机上的答案都是正确的,那你错误的原因大概就是上述的了。 还有一些有关于代码的问题: 1. 你有许多弃之不用的变量乃至数组,建议在写完代码并确定这些变量不使用之后就删除声明它们的语句,不然如果错了你自己调错的时候有可能会被它们所困扰。而且有可能会MLE掉一两个点(这才是最重要的) 2. 建议不要使用万能头文件(虽然它的确好用),因为这样做的话会让你分不清哪个函数是包含在哪个头文件里的。(悄悄告诉你一个秘密,万能头文件也并不是包含了所有的头文件。) 3. 可以通过增加空行、语句块(也就是大括号括住,哪怕只有一条语句)的方法来增强你的代码的美观度。(当然这只是我个人的代码风格,你不喜欢也可以啦。) 4. 建议使用scanf和printf来替代cin/cout,这样子速度会更快一点。具体用法可以问你们OI队的教练,不过TA之后也应该会教的。(曾经我有一次用cin/cout时TLE了一个点,但用scanf/printf就AC了,可能我的代码是真的慢) 5. 建议使用for循环时循环体内的变量i,j之类的东西在循环体内声明,就像这样: ```cpp for(int i=0;i<5;i++){ printf("这是第%d次循环\n",i+1); } ``` 6. for循环中的条件语句完全可以用switch替代if,这样整体的代码看起来更加规整。
by 黑猫_琉璃 @ 2018-08-25 22:30:26


@[黑猫_琉璃](/space/show?uid=83985) 谢谢,本人已A,不过大佬的思路和方法还是不错的。
by RKcer21 @ 2018-08-26 14:22:58


@[黑猫_琉璃](/space/show?uid=83985) 第5条我还是喜欢单步调试,那样可以跟踪很多变量, ``` printf("这是第%d次循环\n",i+1); ``` 这句话假设考试时没删的话就要炸的,考完后要后悔莫及的(就跟文件名打错一样)
by RKcer21 @ 2018-08-26 14:39:11


|