对最近OJ的反思
最近学会了Markdown!
写这篇文为了试试手而已,以后博客并不会把这么简单的东西放上来......
最近c语言学的相当痛苦啊,虽然基本语法、惯用法都已经早早预习过了,简单的OJ也信手拈来,但稍微上一点难度我就寄了。感觉还是见识太少,很多基础的算法课程都没涉及到,我也了解不多。。。。除此之外熟练度也不够,做题用的时间过长了。需要积累经验。
2022-1-types-io:
double a = pow(-8.0,1.0/3);
这是不对的!!!首先pow是double型的,又因为对负数进行小数的指数运算,结果是复数,而math.h库中的pow函数是实数函数, 只能返回一个实数。因此这种运算需要自己写,或者找找有没有复数运算的库。至于想求个三次根号,只需
double a = cbrt(-8);
2022-2-if-for-array:
A题就是个桶计数法。。。B题用模的性质处理大数问题,D题要求得到计算过程中出现的最大值(含初始值)也是很常见的,E题obstacle.c真是难坏了我。。。因为情况实在是太多了,很难找到统一的方法,以致我最后很蠢地用了goto语句来省一些情况。最终解决并不完美,而且有个if的条件写错了一直没发现(abc?acb?),总之磨蹭了好久在这个题。
#include<stdio.h>
#include<stdlib.h>
int main() {
int xa, ya, xb, yb, xc, yc, i;
scanf("%d %d %d %d %d %d", &xa, &ya, &xb, &yb, &xc, &yc);
int nowx = xa, nowy = ya;
if (!( /*共线*/
(/*共横坐标*/xa == xb && xb == xc && ((ya < yc && yc < yb) || (ya > yc && yc > yb))/*共横坐标*/) ||
(ya == yb && yb == yc && ((xa < xc && xc < xb) || (xa > xc && xc > xb))) /*共线*/ )) {
printf("%d\n", abs(yb - ya) + abs(xb - xa));
} else {
printf("%d\n", abs(yb - ya) + abs(xb - xa) + 2);
}
if (!( /*共线*/
(/*共横坐标*/xa == xb && xb == xc && ((ya < yc && yc < yb) || (ya > yc && yc > yb))/*共横坐标*/) ||
(ya == yb && yb == yc && ((xa < xc && xc < xb) || (xa > xc && xc > xb))) /*共线*/ )) {
if (xa == xb & xb == xc || ya == yb & yb == yc) { goto here; }
if (xa == xc) {
if (xa > xb) {
printf("L");
nowx--;
} else {
printf("R");
nowx++;
}
goto here;
} else if (ya == yc) {
if (ya > yb) {
printf("D");
nowy--;
} else {
printf("U");
nowy++;
}
goto here;
}
if (yb == yc && xa < xb && ya < yb && xc < xb) {
for (int i = 0; i < (xb - xa); i++) { printf("R"); }
for (int i = 0; i < (yb - ya); i++) { printf("U"); }
goto finish;
} else if (yb == yc && xa < xb && ya > yb && xc < xb) {
for (int i = 0; i < (xb - xa); i++) { printf("R"); }
for (int i = 0; i < (ya - yb); i++) { printf("D"); }
goto finish;
} else if (yb == yc && xa > xb && ya > yb && xc > xb) {
for (int i = 0; i < (xa - xb); i++) { printf("L"); }
for (int i = 0; i < (ya - yb); i++) { printf("D"); }
goto finish;
} else if (yb == yc && xa > xb && ya < yb && xc > xb) {
for (int i = 0; i < (xa - xb); i++) { printf("L"); }
for (int i = 0; i < (yb - ya); i++) { printf("U"); }
goto finish;
}
here:
while (nowx != xb || nowy != yb) {
if (yb - nowy < 0 && (nowy - 1 != yc || nowx != xc)) {
nowy--;
printf("D");
} else if (yb - nowy > 0 && (nowy + 1 != yc || nowx != xc)) {
nowy++;
printf("U");
} else if (xb - nowx > 0 && (nowx + 1 != xc || nowy != yc)) {
nowx++;
printf("R");
} else if (xb - nowx < 0 && (nowx - 1 != xc || nowy != yc)) {
nowx--;
printf("L");
} else {
break;
}
}
} else {
if (nowx < xb) {
printf("U");
for (i = 0; i < (xb - nowx); i++) {
printf("R");
}
printf("D");
} else if (nowx > xb) {
printf("U");
for (i = 0; i < (nowx - xb); i++) {
printf("L");
}
printf("D");
} else if (nowy > yb) {
printf("R");
for (i = 0; i < (nowy - yb); i++) {
printf("D");
}
printf("L");
} else {
printf("R");
for (i = 0; i < (yb - nowy); i++) {
printf("U");
}
printf("L");
}
}
finish:
return 0;
}
F题字符翻转 Ⅱ (Inverse2.c)是一道很好的题,考察了对scanf的理解,用getchar啥的能够简化代码。 标签:oj,xb,yc,yb,ya,最近,&&,printf From: https://www.cnblogs.com/tengjun12/p/16796817.html