POJ-2632的解题思路有哪些?

2026-04-12 01:471阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计673个文字,预计阅读时间需要3分钟。

POJ-2632的解题思路有哪些?

伪原创可以改写为:虚假原创。以下是修改后的开头内容:

POJ-2632的解题思路有哪些?

虚假原创现象在当今网络时代日益突出,这种不尊重知识产权的行为严重扰乱了正常的创作环境。下面将简要探讨虚假原创的成因及影响。


#include <stdio.h> #include <malloc.h> struct Robot { int x; int y; char direction; }; struct Instruction { int robotId; char action; int repeatTime; }; char direction[4] = {'N', 'E', 'S', 'W'}; char rotate(char originalDirection, char action) { char returnDirection = 0; switch (originalDirection) { case 'N': if (action == 'L') { returnDirection = 'W'; } else { returnDirection = 'E'; } break; case 'E': if (action == 'L') { returnDirection = 'N'; } else { returnDirection = 'S'; } break; case 'S': if (action == 'L') { returnDirection = 'E'; } else { returnDirection = 'W'; } break; case 'W': if (action == 'L') { returnDirection = 'S'; } else { returnDirection = 'N'; } break; } return returnDirection; } void forwardRobot(Robot * robot) { switch (robot->direction) { case 'N': robot->y += 1; break; case 'E': robot->x += 1; break; case 'S': robot->y -= 1; break; case 'W': robot->x -= 1; break; } } void moveRobotAsInstruction(Robot * robot, char action) { if (action == 'L' || action == 'R') { robot->direction = rotate(robot->direction, action); } else if (action == 'F') { forwardRobot(robot); } } bool isCrashed(Robot * robot, int robotId, int robotNum, int EWdiatance, int NSdistance) { if ((robot + robotId)->x <= 0 || (robot + robotId)->y <= 0 || (robot + robotId)->y > NSdistance || (robot + robotId)->x > EWdiatance) { printf("Robot %d crashes into the wall\n", robotId + 1); return true; } for (int i = 0; i < robotNum; i++) { if (i == robotId) { continue; } if ((robot + i)->x == (robot + robotId)->x && (robot + i)->y == (robot + robotId)->y) { printf("Robot %d crashes into robot %d\n", robotId + 1, i + 1); return true; } } return false; } void moveRobots(int EWdiatance, int NSdistance, int robotNum, int instructionNum, Robot * robots, Instruction * instructions) { for (int i = 0; i < instructionNum; i++) { for (int j = 0; j < instructions[i].repeatTime; j++) { // printf("moveRobot %d %c\n", instructions[i].robotId - 1, instructions[i].action); moveRobotAsInstruction(robots + instructions[i].robotId - 1, instructions[i].action); if (instructions[i].action != 'L' && instructions[i].action != 'R') { if (isCrashed(robots, instructions[i].robotId - 1, robotNum, EWdiatance, NSdistance)) { return; } } } } printf("OK\n"); } int main() { int caseNum = 0; scanf("%d", &caseNum); for (int i = 0; i < caseNum; i++) { int EWdiatance; int NSdistance; scanf("%d %d", &EWdiatance, &NSdistance); int robotNum; int instructionNum; scanf("%d %d", &robotNum, &instructionNum); Robot * robots = (Robot *)malloc(robotNum * sizeof(Robot)); Instruction * instructions = (Instruction *)malloc(instructionNum * sizeof(Instruction)); for (int i = 0; i < robotNum; i++) { scanf("%d %d %c", &(robots[i].x), &(robots[i].y), &(robots[i].direction)); } for (int i = 0; i < instructionNum; i++) { scanf("%d %c %d", &(instructions[i].robotId), &(instructions[i].action), &(instructions[i].repeatTime)); // printf("%d %c %d\n", instructions[i].robotId, instructions[i].action, instructions[i].repeatTime); } moveRobots(EWdiatance, NSdistance, robotNum, instructionNum, robots, instructions); free(robots); robots = NULL; free(instructions); instructions = NULL; } }

纯模拟, 考察细心和耐心。

有一个技巧就像是转向的处理(不过我懒, 没搞), 可以搞一个struct 2bit unsigned char成员 存储方向, 在加减越界以后会回到起点或终点,

和转向连转4次回到初始方向一样, 否则写swicth case都巨麻烦。

啥时候自己能做到 纸上写该题code, 一次AC, 就在细心上差不多了。


本文共计673个文字,预计阅读时间需要3分钟。

POJ-2632的解题思路有哪些?

伪原创可以改写为:虚假原创。以下是修改后的开头内容:

POJ-2632的解题思路有哪些?

虚假原创现象在当今网络时代日益突出,这种不尊重知识产权的行为严重扰乱了正常的创作环境。下面将简要探讨虚假原创的成因及影响。


#include <stdio.h> #include <malloc.h> struct Robot { int x; int y; char direction; }; struct Instruction { int robotId; char action; int repeatTime; }; char direction[4] = {'N', 'E', 'S', 'W'}; char rotate(char originalDirection, char action) { char returnDirection = 0; switch (originalDirection) { case 'N': if (action == 'L') { returnDirection = 'W'; } else { returnDirection = 'E'; } break; case 'E': if (action == 'L') { returnDirection = 'N'; } else { returnDirection = 'S'; } break; case 'S': if (action == 'L') { returnDirection = 'E'; } else { returnDirection = 'W'; } break; case 'W': if (action == 'L') { returnDirection = 'S'; } else { returnDirection = 'N'; } break; } return returnDirection; } void forwardRobot(Robot * robot) { switch (robot->direction) { case 'N': robot->y += 1; break; case 'E': robot->x += 1; break; case 'S': robot->y -= 1; break; case 'W': robot->x -= 1; break; } } void moveRobotAsInstruction(Robot * robot, char action) { if (action == 'L' || action == 'R') { robot->direction = rotate(robot->direction, action); } else if (action == 'F') { forwardRobot(robot); } } bool isCrashed(Robot * robot, int robotId, int robotNum, int EWdiatance, int NSdistance) { if ((robot + robotId)->x <= 0 || (robot + robotId)->y <= 0 || (robot + robotId)->y > NSdistance || (robot + robotId)->x > EWdiatance) { printf("Robot %d crashes into the wall\n", robotId + 1); return true; } for (int i = 0; i < robotNum; i++) { if (i == robotId) { continue; } if ((robot + i)->x == (robot + robotId)->x && (robot + i)->y == (robot + robotId)->y) { printf("Robot %d crashes into robot %d\n", robotId + 1, i + 1); return true; } } return false; } void moveRobots(int EWdiatance, int NSdistance, int robotNum, int instructionNum, Robot * robots, Instruction * instructions) { for (int i = 0; i < instructionNum; i++) { for (int j = 0; j < instructions[i].repeatTime; j++) { // printf("moveRobot %d %c\n", instructions[i].robotId - 1, instructions[i].action); moveRobotAsInstruction(robots + instructions[i].robotId - 1, instructions[i].action); if (instructions[i].action != 'L' && instructions[i].action != 'R') { if (isCrashed(robots, instructions[i].robotId - 1, robotNum, EWdiatance, NSdistance)) { return; } } } } printf("OK\n"); } int main() { int caseNum = 0; scanf("%d", &caseNum); for (int i = 0; i < caseNum; i++) { int EWdiatance; int NSdistance; scanf("%d %d", &EWdiatance, &NSdistance); int robotNum; int instructionNum; scanf("%d %d", &robotNum, &instructionNum); Robot * robots = (Robot *)malloc(robotNum * sizeof(Robot)); Instruction * instructions = (Instruction *)malloc(instructionNum * sizeof(Instruction)); for (int i = 0; i < robotNum; i++) { scanf("%d %d %c", &(robots[i].x), &(robots[i].y), &(robots[i].direction)); } for (int i = 0; i < instructionNum; i++) { scanf("%d %c %d", &(instructions[i].robotId), &(instructions[i].action), &(instructions[i].repeatTime)); // printf("%d %c %d\n", instructions[i].robotId, instructions[i].action, instructions[i].repeatTime); } moveRobots(EWdiatance, NSdistance, robotNum, instructionNum, robots, instructions); free(robots); robots = NULL; free(instructions); instructions = NULL; } }

纯模拟, 考察细心和耐心。

有一个技巧就像是转向的处理(不过我懒, 没搞), 可以搞一个struct 2bit unsigned char成员 存储方向, 在加减越界以后会回到起点或终点,

和转向连转4次回到初始方向一样, 否则写swicth case都巨麻烦。

啥时候自己能做到 纸上写该题code, 一次AC, 就在细心上差不多了。