0

所以,基本上,检查下面的图片:

图片

这是解释的 4x5 网格,但实际挑战需要您输入网格尺寸。所以,我的工作是编写一个程序来计算你转动的次数(在这种情况下是红点)。起始位置始终在左下角。这家伙正在按时钟的箭头移动(“右”)。

程序输入/输出为:您输入的网格尺寸:4 5(例如)

你输出方向变化的量。7

所以,我完全不知道它是如何完成的。我只看到的解决方案如下:

#include <iostream>
#include <cmath>
using namespace std;
int main() {
    long long n, i,pom,m;
    int k,br=0;

    cin>>n>>m;
    if(n>m) {
        int pom=n;
        n=m;
        m=n;
    }
    if(n+1>=m)
        cout<<(n-1)+(m-1);
    else
        cout<<(n-1) +(n-1)+1;

    return 0;
}

但我不明白下面的例子......谁能解释发生了什么?或者任何其他解决这个问题的方法总是受欢迎的。

4

3 回答 3

2
int res = 0;
if(height == width)
    res = height * 2 - 2;//when height is odd than you will have 2 rows with single red dot
                           //when height is even you will have one row without red dot (all the rest have 2 red dots.
else if (width > height)
   res = height * 2 - 1;//one rows with 1 red dot the rest with 2 red dots.
else //height > width
   res = width * 2 - 2// 2 columns with one red dot and the rest with 2 red dots.
于 2013-03-03T11:27:39.693 回答
1

我不是 C++ 人,所以无法帮助理解代码。但肯定可以帮助了解这里的情况。情况是匝数将仅取决于两个维度之一。哪个更少。所以匝数取决于较小的尺寸和那一侧的盒子数量。因为在图片中,当您采用 4X5 阵列时,无论您将宽度增加到多少。只要高度为 4,则转数将仅保持 7。但是,如果将宽度从 4 减小到 3,则匝数现在取决于宽度。

现在关于点的数量。如果两个维度相同且奇数,则假设维度为 2A+1,则匝数将为 4*A。

如果一个维度较小,则如果维度相同且偶数,则假设维度为 2*A ,则匝数将为 4A-2。

如果较小的尺寸是偶数,则假设尺寸为2*A,那么匝数将为4A-1。

如果较小的尺寸是奇数,则假设尺寸为2A+1,那么匝数将为4A+1。

看看这是否适用于您自己的新代码。

于 2013-03-03T11:51:00.350 回答
1

此代码有条件地交换nm制作n <= m

if(n>m) {
    int pom=n;
    n=m;
    m=n;
}

鉴于此,条件n+1>=m等价于n == m || n + 1 == m

请注意,这两个公式(n-1)+(m-1)(n-1) +(n-1)+1给出相同的结果n + 1 == m

所以实际上没有必要检查是否n + 1 == m; 只有特殊情况n == m才重要。如果n == m,那么你可以使用公式(n-1)+(m-1),或者只是2 * n - 2。否则,使用公式(n-1) +(n-1)+1,或者只是2 * n - 1

重写代码:

int calculate_number_of_turns(int m, int n)
{
    if (m == n)
        return 2 * n - 2;
    else
        return 2 * std::min(m, n) - 1;
}

编辑:

如果您想从头开始编写代码,而无需事先了解数学,您可以先编写一个递归函数。

如果n = 2,很容易看出答案是 3(3 圈)。如果m = 2,则答案为 2。否则(假设n > 2m > 2),计算涉及为不同的参数调用相同的函数。

int calculate_number_of_turns(int m, int n)
{
    if (n == 2)
        return 3;
    else if (m == 2)
        return 2;
    else
        return calculate_number_of_turns(???, ???);
}

想象一下从图片中的路径开始,然后在第二个转弯后立即停止。如果你把图片倒过来,就好像你用和高度减1一样。所以调用相同的函数将计算除了前2圈之外还m - 1, n - 1剩下要做的圈数。

int calculate_number_of_turns(int m, int n)
{
    if (n == 2)
        return 3;
    else if (m == 2)
        return 2;
    else
        return 2 + calculate_number_of_turns(m - 1, n - 1);
}

现在,将此递归函数转换为任何更简单的形式并不太复杂(只需计算函数将调用自身的次数,直到终止条件成立)。

于 2013-03-03T11:51:07.690 回答