提示:文章
文章目录
前言
前期疑问:
本文目标:
一、背景
最近
二、HJ17坐标移动
2.1 AC版
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include "stdbool.h"
typedef struct {
char a;
int len;
} moveData;
bool isTargetStr(char* str) {
int len = strlen(str);
if(len < 2)
{
return false;
}
if (!isalpha(str[0])) {
return false;
}
for (int i = 1; i < len; i++) {
if (!isdigit(str[i])) {
return false;
}
}
return true;
}
void getData(char* str, char* c, int* len) {
*c = str[0];
*len = atoi(&str[1]);
}
int* calculateDst2(moveData* data, int count, int array[]) {
for (int i = 0; i < count; i++) {
if (data[i].a == 'a') {
array[0] = array[0] - data[i].len;
} else if (data[i].a == 'd') {
array[0] = array[0] + data[i].len;
} else if (data[i].a == 'w') {
array[1] = array[1] + data[i].len;
} else if (data[i].a == 's') {
array[1] = array[1] - data[i].len;
}
}
return array;
}
void calculateDst(moveData* data, int count, int (*array)[]) {
for (int i = 0; i < count; i++) {
if (data[i].a == 'a') {
*(*array) = *(*array) - data[i].len;
} else if (data[i].a == 'd') {
*(*array) = *(*array) + data[i].len;
} else if (data[i].a == 'w') {
*(*array + 1) = *(*array + 1) + data[i].len;
} else if (data[i].a == 's') {
*(*array + 1) = *(*array + 1) - data[i].len;
}
}
}
moveData data[10000];
int main() {
char str[10000];
char retStr[50] = {'\0'};
//while (gets(str) != NULL) { // 注意 while 处理多个 case
while (scanf("%s", str) != EOF) {
// 64 位输出请用 printf("%lld") to
int len = strlen(str);
char dstStr[10000] = {'\0'};
int moveDataIndex = 0;
int index = 0;
for (int i = 0; i < len ; i++) {
if (str[i] == ';') {
continue;
}
while (str[i] != ';') {
dstStr[index++] = str[i++];
}
index = 0;
if (isTargetStr(dstStr)) {
char charater;
int length;
getData(dstStr, &charater, &length);
data[moveDataIndex].a = tolower(charater);
data[moveDataIndex].len = length;
moveDataIndex++;
}
memset(dstStr, '\0', sizeof(dstStr));
}
int array[2] = {0};
calculateDst(data, moveDataIndex, &array);
snprintf(retStr, sizeof(retStr), "%d", array[0]);
int retStrIndex = strlen(retStr);
retStr[retStrIndex] = ',';
snprintf(&retStr[retStrIndex + 1], sizeof(retStr), "%d", array[1]);
printf("%s", retStr);
}
return 0;
}
下面是第一版有问题的版本
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include "stdbool.h"
typedef struct {
char a;
int len;
} moveData;
bool isTargetStr(char* str) {
int len = strlen(str);
if (!isalpha(str[0])) {
return false;
}
for (int i = 1; i < len; i++) {
if (!isdigit(str[i])) {
return false;
}
}
return true;
}
void getData(char* str, char* c, int* len) {
*c = str[0];
//printf("%s\n", &str[1]);
*len = atoi(&str[1]);
}
int* calculateDst(moveData* data, int count, int array[]) {
for (int i = 0; i < count; i++) {
if (data[i].a == 'a') {
array[0] = array[0] - data[i].len;
} else if (data[i].a == 'd') {
array[0] = array[0] + data[i].len;
} else if (data[i].a == 'w') {
array[1] = array[1] + data[i].len;
} else if (data[i].a == 's') {
array[1] = array[1] - data[i].len;
}
}
return array;
}
moveData data[10000];
int main() {
char str[10000];
char retStr[50] = {'\0'};
//while (gets(str) != NULL) { // 注意 while 处理多个 case
while (scanf("%s", str) != EOF) {
// 64 位输出请用 printf("%lld") to
int len = strlen(str);
char dstStr[10000] = {'\0'};
int moveDataIndex = 0;
int index = 0;
for (int i = 0; i < len ; i++) {
if (str[i] != ';') {
dstStr[index++] = str[i];
}
else {
index = 0;
i++;
}
if (isTargetStr(dstStr)) {
char charater;
int length;
getData(dstStr, &charater, &length);
printf("%c %d", charater, length);
data[moveDataIndex++].a = tolower(charater);
data[moveDataIndex++].len = length;
}
}
int array[2] = {0};
//array = calculateDst(data, moveDataIndex, array);
calculateDst(data, moveDataIndex, array);
//printf("%d %d", array[0], array[1]);
snprintf(retStr, sizeof(retStr), "%d", array[0]);
int retStrIndex = strlen(retStr);
retStr[retStrIndex] = ',';
snprintf(&retStr[retStrIndex + 1], sizeof(retStr), "%d", array[1]);
//itoa(array[0], retStr, 10);
//retStr[1] = ',';
//retStr[2] = itoa(array[1]);
printf("%s", retStr);
}
return 0;
}
2.2 编程总结:
1、赋值时使用++,但是使用了两次导致程序异常。之前也出现过这个问题。
2、使用gets的时候懵逼了。
3、数组传参传地址在函数中修改时懵逼了。
4、将sourceStr赋值给dstStr时,使用的if没处理好
5、dstStr没有用memset清空,导致程序异常
6、修正了fgets的用法。帖子链接
三、HJ22汽水瓶
3.1 代码
3.1.1 AC版
#include <stdio.h>
int getValue(int bottleNum)
{
if(bottleNum == 1)
{
return 0;
}
else if(bottleNum == 2)
{
return 1;
}
else if (bottleNum > 2) {
return bottleNum / 3 + getValue(bottleNum / 3 + bottleNum % 3);
}
return 0;
}
int main() {
int num;
while (scanf("%d", &num) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
//printf("%d\n", num);
if(num == 0)
{
break;
}
int value = getValue(num);
printf("%d\n", value);
}
return 0;
}
3.1.2 前一版
#include <stdio.h>
int getValue(int bottleNum)
{
if(bottleNum == 1)
{
return 0;
}
else if(bottleNum == 2)
{
return 1;
}
else if (bottleNum > 2) {
return bottleNum / 3 + getValue(bottleNum % 3);
}
return 0;
}
int main() {
int num;
while (scanf("%d", &num) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
//printf("%d\n", num);
if(num == 0)
{
break;
}
int value = getValue(num);
printf("%d\n", value);
}
return 0;
}
3.2 编程总结
牛客上这题我是没通过的,之前可能也是很费脑子的,但是今天花了两三分钟就ac了。这么来说其实还是有进步的。
只要能进步其实就很不错了。如果快不了,那就慢慢来吧。
总结
未完待续