C语言是否有任何框架Stewart算法的含义。我在python中有以下代码,效果很好。

def FrameStewart(ndisks,npegs):
    if ndisks ==0: #zero disks require zero moves
        return 0
    if  ndisks == 1 and npegs > 1: #if there is only 1 disk it will only take one move
        return 1
    if npegs == 3:#3 pegs is well defined optimal solution of 2^n-1
        return 2**ndisks - 1
    if npegs >= 3 and ndisks > 0:
        potential_solutions = (2*FrameStewart(kdisks,npegs) + FrameStewart(ndisks-kdisks,npegs-1) for kdisks in range(1,ndisks))
        return min(potential_solutions) #the best solution
    #all other cases where there is no solution (namely one peg, or 2 pegs and more than 1 disk)
    return float("inf")

a = int(raw_input("Disks [>] "))
b = int(raw_input("rods [>] "))
print FrameStewart(a, b) #prints 161


我编写了以下C代码,但未给出正确的输出

#include<stdio.h>

int power(int a, int b){
    int p=1,i;
    for(i=0;i<b;i++){
        p*=a;
    }
    return p;
}

int min(int abc[],int n){
    int min = abc[0],i;
    for(i=1;i<n;i++)
    {
        if(abc[i]<min){
            min = abc[i];
        }
    }
    return min;
}

int hanoi(int rods, int disks)
{
    int moves=2147483647,i;
    if(disks==0)
        return 0;
    if(disks==1)
        return 1;
    if(rods==3)
        return power(2,disks)-1;
    if(rods>=3 && disks>0){
        int potential_moves[disks-1];
        for(i=1;i<disks;i++){
            potential_moves[i-1]=2*hanoi(i,rods) + hanoi(disks-i,rods-1);
        }
        return min(potential_moves, disks-1);
    }
    return moves;
}

int main(){
    int rods,disks;
    printf("***** Tower of Hanoi (for n rods) *****\n");
    printf("Enter no. of disks : ");
    scanf("%d",&disks);
    printf("Enter no. of rods : ");
    scanf("%d",&rods);
    if(disks>1 && rods<3){
        printf("Invalid input rods must be greater than 2 for 2 or more disks\n");
        return -1;
    }
    int moves = hanoi(rods, disks);
    printf("Minimum np. of moves are : %d\n", moves);
    return 0;
}


谁能告诉我为什么我的代码不正确或C中Frame Stewart算法的正确含义。

最佳答案

您的逻辑是正确的,但它有一个简单但难以发现的错误。递归调用函数时,您已经颠倒了参数。
在这里看看

potential_moves[i-1]=2*hanoi(i,rods) + hanoi(disks-i,rods-1);


该行应该是

potential_moves[i-1]=2*hanoi(rods,i) + hanoi(rods-1, disks-i);


解决问题!

关于c - 汉诺塔(框架斯图尔特)k钉在c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46435617/

10-11 23:23
查看更多