C++ 河内c&x2B改造塔+;

C++ 河内c&x2B改造塔+;,c++,C++,我的问题基本上是这个链接的一个问题的修改 在这个问题上,它假设一些光盘大小相同。我的问题有点复杂。让我们假设相同大小的光盘具有不同的颜色。当你把这些碟片从a移到c时,你必须确保碟片的摆放顺序与开始时的顺序相同。我们需要找到解决这个问题的最起码的办法 我这里有一个例子 如您所见,如果我们有1张大小为1的光盘和2张大小为2的光盘。我们至少需要移动7次 肯尼·奥斯特罗姆的Thx。首先,我知道如果你在底部有多个相同大小的盘子,那么你必须拿一个盘子假装它比其他的大,即使它是相同大小的。第二,我认为对于一

我的问题基本上是这个链接的一个问题的修改

在这个问题上,它假设一些光盘大小相同。我的问题有点复杂。让我们假设相同大小的光盘具有不同的颜色。当你把这些碟片从a移到c时,你必须确保碟片的摆放顺序与开始时的顺序相同。我们需要找到解决这个问题的最起码的办法

我这里有一个例子

如您所见,如果我们有1张大小为1的光盘和2张大小为2的光盘。我们至少需要移动7次

肯尼·奥斯特罗姆的Thx。首先,我知道如果你在底部有多个相同大小的盘子,那么你必须拿一个盘子假装它比其他的大,即使它是相同大小的。第二,我认为对于一组大小相同的圆盘,除了底部的圆盘之外,每个圆盘都应该被移动两次,因为我们试着有一个正确的顺序。 然而,这似乎并没有带来正确的答案

<>这是我们C++作业的一个问题,问题是:

N表示光盘的大小,介于1和15000之间

M只是一个数字,介于1和1000000之间

a[i]表示大小为i的光盘的编号

我需要打印出(最少的移动次数)mod M。所以我猜也许有更好的方法来计算(2^n)mod M

这是我的密码:

#include<iostream>
#include <math.h>
using namespace std;
int main()
{
    int N,M; //for an example:N=2,M=1000
    cin>>N>>M;
    int *a=new int[N+2];
    for(int i=1;i<=N;i++) cin>>a[i]; //I abandon the first element of this array
                                     // just to make it easier for after
                                     // for an example: {0,1,2}

    if(a[N]>1){      //take the bottom one as a seperate group
        a[N]=a[N]-1;
        a[N+1]=1;
    }
    int j=N+1;

    int num=0;

    for(int i=1;i<=j;i++){
        if(a[i]<=1){
            num=num+pow(2,j-i);
        }
        else{
            num=num+pow(2,j-i)*(2*(a[i]-1)+1);//for every group of discs in the middle
        }
    }
    cout<<num;
    cout<<num%M;

    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
int N,M;//例如:N=2,M=1000
cin>>N>>M;
int*a=新的int[N+2];
for(int i=1;i>a[i];//我放弃这个数组的第一个元素
//只是为了方便以后的工作
//例如:{0,1,2}
如果(a[N]>1){//则将底部的一个作为一个单独的群
a[N]=a[N]-1;
a[N+1]=1;
}
int j=N+1;
int num=0;
对于(int i=1;i“相同大小磁盘”的关键洞察您链接到的解决方案是,最佳策略始终是将相同大小的磁盘作为一个单元移动,因此您可以将相同大小的磁盘压缩为一个磁盘,从而增加成本。相同大小的磁盘不计入塔的高度,但它们计入实际将其作为一个组移动的成本

但如果最终答案必须保持原来的顺序,那么你的新约束条件是你必须移动相同大小的盘子偶数次。这是因为你先移动上面的盘子,依此类推,直到你将底部的盘子移动到所有其他相同大小的盘子上。因此,移动一次,它们就会颠倒过来(或任意奇数次),但如果您这样做两次(或任意偶数次),则它们将再次反转,因此将按原始顺序进行

但是,查看张贴的移动相同尺寸板材的解决方案,您会发现每组将始终移动2次幂,从2^(n-1)在顶部,一直到底部的2^0。但除了底部,这始终是一个偶数。因此,如果底部有多个大小相同的盘子,则必须取下一个底板,并假装它比其他底板大,即使它大小相同


由于这是家庭作业,我不会发布代码,但一旦你弄清楚发生了什么事情,这应该很容易。你链接的答案中大部分都提到了这一点,唯一的变化是“相同大小的盘子”组必须移动偶数次才能保持原来的堆叠顺序。

pow(2,x)可以通过位移位来完成,因为1数组“a”的第一个元素有N个元素,是a[0]。最后一个元素是[N-1]int M,除了(有时)使最后一个打印的数字无缘无故地不同之外,没有其他用途?哦,是的,你给出的示例7是正确的。你如何在数组中表示该示例?{1,2}?那么你是在考虑塔架尺寸的减少,a[i]表示i级相同尺寸的板的数量?那么你是说“如果有多个板”,然后用*a[i]单独计算移动多个板。但是你还有一个额外的*2,所以你移动它们两次(以保持它们的顺序)?但这是错误的。你只能保证有一个销钉来移动它们,所以你不能这样做。这也是错误的,因为它是次优的。你只需要在最终状态下保持秩序。谢谢你。我按照你说的写了这段代码。它给出了示例问题的正确答案。但是,它似乎仍然有一些错误因为我没有得到正确的答案。#include#include使用名称空间std;int main(){int N,M;cin>>N>>M;int*a=new int[N+2];for(int I=1;I>a[I];int num=0;if(a[N]=1){for(int I=1;I#include#include使用名称空间std;int main(){int main,M;cin>>N>>M;int*a=new int[N+2];for(int I=1;int[I=1;int[I]=1;if[I]{for(int i=1;i
#include#include使用名称空间std;int main(){int N,M;cin>>N>>M;int*a=new int[N+2];for(int i=1;i>a[i];int num=0;if(a[N]=1){for(int i=1;对不起。我是新来的,不知怎么的,我不明白它是怎么工作的。我想知道这是否是一个算法问题,或者可能只是我的代码或num对于模块来说太大了。