【问题标题】:Robot Path Simulator [closed]机器人路径模拟器[关闭]
【发布时间】:2019-12-03 02:40:24
【问题描述】:

我对编程还是很陌生,而且由于我们最近开始使用 C,因此我们的任务是在假设的无限网格上创建一个程序(机器人模拟器),当然只使用三个可能的动作:右转,左转前进。输出只需 x 和 y 坐标 (x,y)。现在的问题是,我只能通过所有四个动作(上,下,左,右 - 北,南,西,东)来理解并做到这一点(假设没有左转或右转选项,左意味着移动 1位置向左,向右意味着向右移动 1 个位置等))。所以只是它们之间的一个简单的减法给了我最终的坐标,但我根本不知道如何为那些有 2 个转弯选项和前进的人制定规则。我会把我的代码留给我已经完成的任务如果有人认为我可以升级那个或者对如何使它工作有任何建议或想法,请告诉我。

#include<stdio.h> 
static void position(int n, char* string)
{
    int left = 0, right = 0, up = 0, down = 0;
    for (int i = 0; i < n; i++) {
        if (string[i] == 'L')
            left++;
        else if (string[i] == 'R')
            right++;
        else if (string[i] == 'U')
            up++;
        else if (string[i] == 'D')
            down++;
    }
    printf("(%d,%d)", (right - left), (up - down));
}
int main()
{
    printf("Enter your movement: ");
    char string[1000];
    scanf("%s", string);
    int n;
    for (n = 0; string[n] != '\0'; ++n);
    string[100] = string[n];
    position(n, string);
}

【问题讨论】:

  • C# 不是 C++ 不是 C。它们不是同一种语言,只是因为它们以相同的字母开头,就像毛毛虫、汽车和胡萝卜一样。请仅使用您实际使用的语言的标签。标签垃圾邮件是让您的问题被关闭和否决的绝佳方式。在开始发帖之前,您应该花一些时间查看tour 并阅读help center 页面以了解该网站的工作原理。
  • 我不认为您的意图是只给position 打一次电话。您的代码需要跟踪当前位置,position 函数需要为重复输入更新当前位置。然后你只需要计算出每个操作的数学运算是什么。例如:根据 left 的定义方式,它可能是 left(x,y)=(x,y-1)。然后你需要处理边界条件。
  • 请提供样本输入和所需输出的集合。
  • 这部分我没看懂,请多解释一下:“所以只是它们之间的简单减法给了我最终的坐标”。
  • 我错过了有关初始标题的信息。我们可以假设机器人最初面向北/上吗?这意味着“前进”的第一个命令将机器人带到(0,1),另一个“前进”到(0,2)。

标签: c terminal


【解决方案1】:

解决此问题的一种方法是使用笛卡尔坐标系。

我没有在最后尝试计算所有内容,而是在处理过程中跟踪它们。

#include<stdio.h> 

enum {NORTH/*UP*/,SOUTH/*DOWN*/, EAST/*LEFT*/, WEST/*RIGHT*/};
static void position(int n, char* string)
{                           // let's use a Cartesian coordinate system
    // assume a 10x10 grid
    int X=0,Y=0;            // start at this place within the grid (the center)
    int direction = NORTH;  // we are facing NORTH
    int i;
    for (i = 0; i < n; i++) {
        if (string[i] == 'L') // TURN LEFT, no step
        {   // pivot
            switch (direction)
            {
            case NORTH: 
                direction = EAST;   // face EAST, but do not step
                break;
            case SOUTH: 
                direction = WEST;   // face WEST, but do not step
                break;
            case EAST: 
                direction = SOUTH;  // face SOUTH, but do not step
                break;
            case WEST: 
                direction = NORTH;  // face NORTH, but do not step
                break;
            }
        }
        else if (string[i] == 'R') // TURN RIGHT, no step
        {   // pivot
            switch (direction)
            {
            case NORTH: 
                direction = WEST;   // face WEST, but do not step
                break;
            case SOUTH: 
                direction = EAST;   // face EAST, but do not step
                break;
            case EAST: 
                direction = NORTH;  // face NORTH, but do not step
                break;
            case WEST: 
                direction = SOUTH;  // face SOUTH, but do not step
                break;
            }
        }
        else if (string[i] == 'A')
        {   // advance
            switch (direction)
            {
            case NORTH: 
                if (Y == 5)
                    printf("you cannot go NORTH any more.\n");
                else
                    Y++;
                break;
            case SOUTH: 
                if (Y == -5)
                    printf("you cannot go SOUTH any more.\n");
                else
                    Y--;
                break;
            case EAST: 
                if (X == -5)
                    printf("you cannot go EAST any more.\n");
                else
                    X--;
                break;
            case WEST: 
                if (X == 5)
                    printf("you cannot go WEST any more.\n");
                else
                    X++;
                break;
            }
        }
        else
        {
            printf("%c is not a valid command.\n", string[i]);
        }
    }
    printf("(%d,%d)", X, Y);
}
int main()
{
    char string[1000];
    int n;
    for(;;)
    {   // only valid movements are turn Right,turn Left and Advance. (RLA)
        printf("Enter your movement: ");
        scanf("%s", string);
        for (n = 0; string[n] != '\0'; ++n);
        string[100] = string[n];
        position(n, string);
    }
}

示例 I/O

输入你的动作:@

@ 不是有效的命令。

(0,0)

输入你的动作:LLLA

(1,0)

输入你的动作:LLLA

(1,0)

输入你的动作:LLAAA

(3,0)

输入你的动作:LLARRRAA

(2,-1)

输入你的动作:LRRLRA

(0,1)

【讨论】:

  • 您不同意 OP 询问不再使用“UDRL”吗?
  • @Yunnosch 也许。在我的示例中,您可以用 N、S、E、W、NE、SE、NW、SW 替换 UP/DOWN 等。尽管需要实施对角线。然后我们需要定义“右转”如果右转的字面意思是“转”,如果是这种情况,那么我们需要包括一个我们正在行驶的方向标志。所以基本上如果你往上走然后你右转你说向西前进,如果你再右转,你现在向南前进。再次向右,你现在向东前进。这些情况可以添加到我上面的代码中,没有太多麻烦。
  • 是的,这就是我很确定 OP 所要求的。语义上相同的罗盘方向的名称更改是无关紧要的。 “相对”的方向概念是需要改变的。但是没有 OP 的任何反馈,讨论是没有实际意义的。恐怕你英勇付出的努力会在这样的提问者身上丢失......
  • @Yunnosch,好的,这是一个有趣的练习;)我已经将我的示例更新为我 认为 OP 所要求的。 L 和 R 中的每一个都只是简单地旋转机器人所面对的 方向 - 无需迈出一步。 A(前进)然后将机器人朝那个方向移动一步(如果可能的话)。
  • 我希望我没有为你破坏任何东西。但实际上,您现在处于让单极子回答这个问题的舒适位置。 ;-)
猜你喜欢
  • 2011-02-01
  • 2012-02-03
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多