C++ 不带容器的绘图池桌球轨迹

C++ 不带容器的绘图池桌球轨迹,c++,drawing,C++,Drawing,问题陈述如下: 说明: 编写一个C++程序,读取池表的尺寸,并以0的轨迹在左上角的表中以45角的形式打印出一个球的轨迹。 输入: 输入由几个案例组成,每个案例都有行数和列数。这两个数字至少都是2 输出: 打印每个池表,如示例所示 观察: 预期的解决方案不使用向量或类似的方法。这包括向量、字符串、数组等。从数学上讲,预期的解决方案在最坏的情况下使用O(1)内存 示例: 样本输入: 7 4 10 16 样本输出: ###### #0 # # 0 # # 0 # # 0# # 0 #

问题陈述如下:

说明:

编写一个C++程序,读取池表的尺寸,并以0的轨迹在左上角的表中以45角的形式打印出一个球的轨迹。

输入:

输入由几个案例组成,每个案例都有行数和列数。这两个数字至少都是2

输出:

打印每个池表,如示例所示

观察:

预期的解决方案不使用向量或类似的方法。这包括向量、字符串、数组等。从数学上讲,预期的解决方案在最坏的情况下使用O(1)内存

示例:

样本输入:

7 4
10 16
样本输出:

######
#0   #
# 0  #
#  0 #
#   0#
#  0 #
# 0  #
#0   #
######

##################
#0     0     0   #
# 0   0 0   0 0  #
#  0 0   0 0   0 #
#   0     0     0#
#  0 0   0 0   0 #
# 0   0 0   0 0  #
#0     0     0   #
# 0   0 0   0 0  #
#  0 0   0 0   0 #
#   0     0     0#
##################
如果你可以使用一个矩阵,在每次移动后,一直标记球的位置,并沿着球的轨迹直到球碰到一个角,那么这个问题的解决方案将相当容易。但是他们希望您不要使用这样的数据结构(这是一门入门编程课程,只是为了练习),所以这有点困难

我想到了一个解决方案,每行打印输出池表行,跟踪球的位置,但我遇到的主要问题是在第二种情况下(10,16)能够预测球的位置当您打印第一行时,您已经需要知道,在与桌子发生碰撞后,球最终将再次到达它两次


有没有办法解决这个问题?

最简单的办法是预先分配要显示的字符串缓冲区。要么:

  • std::strings的数组,string[y+some]
  • 二维数组,char[y+some][x+some]
  • 或者一个简单的字符数组,char[(x+some)*(y+some)]
+有些用于边界、“\0”终端等。。。 您可能希望使用new动态分配它,以便可以调整每个表的缓冲区大小。或者只分配一个覆盖最大表的更大的表


然后,用空格填充缓冲区,并在数组中绘制边框。将球从(0,0)开始,在未完成时迭代,将“0”放入缓冲区。完成后,逐行打印整个缓冲区。

愚蠢地执行Jeffreys的建议。在计算上很愚蠢,可能在数学上更容易做到这一点,但它回答了这个问题

bool SimulateBallUntil(int width, int height, int x, int y)
{
    // start off heading down right
    int xInc = 1;
    int yInc = 1;

    // Start off at pos 0,0
    int curX = 0;
    int curY = 0;

    // Run the path...
    for(int iter=0;;++iter)
    {
        // Check if hit point
        if(curX == x && curY == y)
        {
            return true;
        }

        // Check if hit corner (ignoring the first iteration which is the left corner)
        if(iter && ((curY == 0) || (curY == height-1)) && ((curX == 0) || (curX == width-1)))
        {
            return false;
        }

        // Bounce off walls
        if(curX + xInc == width || ((curX + xInc)==-1))
        {
            xInc *= -1;
        }
        if(curY + yInc == height || (curY + yInc==-1))
        {
            yInc *= -1;
        }

        // Move it
        curX += xInc;
        curY += yInc;

    }
}
intpositivemod(intx,inty)
{
返回((x%y)+y)%y;
}
int main()
{
int x,y,sx,sy;
int startX;
int minStartX=0;
cin>>sy>>sx;
startX=0;
//在y=0的情况下计算x上的各个起点,保持最小值以确定重复的步幅
做
{
startX=(startX+2*(sy-1))%(2*(sx-1));
如果((minStartX==0)| |(startX欢迎访问stackoverflow.com。请花一些时间阅读,尤其是名为和的部分。也请。您可能还想学习如何创建一个。我相信这可以在不实际计算轨迹的情况下解决,使用宽度和高度以及一些聪明的算法,即更多的是在数学中查找模式,而不是关于计算机中的模拟。只是一个小提示:将表格图像一分为二,第一个从左上到右下,第二个从右上到左下。然后你可以注意到一些模式。@丹尼斯好的,我注意到了模式,现在的问题是计算两个不同的“0”之间的距离出租对角线轨迹,但在同一行中。我发现这相当困难,我一直在尝试生成一些示例,试图查看输入和距离之间的关系,但我还没有找到。我将继续尝试。无论如何,很好的提示。这个问题有一个简单的数学解决方案。但也有一个残酷的force算法(可采用@Mike Vine answer),这仍然是渐近最优的。如果你想找到精确的方程,想象无限多个相似的表彼此靠近,像这样镜像,然后沿着球的轨迹。正如我所说的,我将编辑问题以使其更清楚,预期的解决方案不使用向量或类似的东西。这当然包括字符串(本质上是字符向量)、数组、deques、列表、队列、堆栈……等等。换句话说,解决方案使用O(1)内存,所以这个解决方案是无效的。K,对不起。删除C++标签。然后:-p。这是一个离散的数学问题。可能是用x和y的公共除法器来完成的,还有一些模运算。我不明白为什么我需要删除它。我需要在C++中实现这个解决方案,在这个问题中我指定了一些条件。必须满足。当然,你可以使用你想要的任何东西,只要它满足不断使用内存的要求。我也想到了一种像你说的方法,但还没有找到任何解决方案。无论如何,谢谢:)我肯定有一个有趣的答案形式if(x,y,sizeX,sizeY的数学函数)然后打印“0”或打印“”。否则,对于编程类,在O(1)内存中,我将只调用函数bool simulateBallUtil(int x,int