对其中具有函数的数组进行排序

时间:2019-06-05 10:47:38

标签: c arrays

数组中有函数,我想对其进行排序,并使用具有最低值的函数。我正在尝试制作一个AI,可以解决Simon Tatham Sixteen [3x3]游戏。函数是运算符,而AI会选择值最低的运算符。

int tomb[3][3]={3,4,7,8,1,2,9,5,6};

int cel[3][3]={1,2,3,4,5,6,7,8,9};

int heurisztika(int tomb[3][3], int cel[3][3]){
    int i, j, k, l, counter=0, count2=0;

    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            if(tomb[i][j]!=cel[i][j]){
                counter++;
            }
        }
    }

    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            for(k=0;k<3;k++){
                for(l=0;l<3;l++){
                    if(cel[i][j]==tomb[k][l]){
                        if(i==k && j==l){
                            count2=count2+0;
                        }
                        else if(i==k || j==l){
                            count2=count2+1;
                        }
                        else if(i!=k && j!=l){
                            count2=count2+2;
                        }
                    }
                }
            }
        }
    }

    return counter + count2;
}

int Sor1Balra(int tomb[3][3]){  //every function look like this
    int tmp;
    tmp=tomb[0][2];
    tomb[0][2]=tomb[0][0];
    tomb[0][0]=tomb[0][1];
    tomb[0][1]=tmp;

    int ertek=heurisztika(tomb,cel);

    return ertek;
}

int (*operatorok[9])(tomb) = {Sor1Balra, Sor1Jobbra, Sor2Balra, Sor2Jobbra, Sor3Balra, Sor3Jobbra, Oszlop1Fel, Oszlop1Le, Oszlop2Fel, Oszlop2Le, Oszlop3Fel, Oszlop3Le};

2 个答案:

答案 0 :(得分:4)

您应该像这样从qsort调用stdlib.h函数 qsort((void*)arr, size, sizeof(arr[0]), comparator) 其中arr是数组的名称,comparator是比较两个函数的函数。我假设此函数没有参数。

typedef int (*myFuncDef)();
int comparator(const void *p, const void *q)  
{ 
    myFuncDef l = *((myFuncDef*)p); 
    myFuncDef r = *((myFuncDef*)q); 
    return (l() - r()); 
}

答案 1 :(得分:2)

数组函数的最小值是返回最小值的函数。

为了确定这一点,您的sort函数必须调用每个数组函数,并查看每两个函数返回的内容,例如像冒泡排序,但不是比较数组元素,而是比较函数返回的值,例如:

    if (a[i]() > a[i+1]()) /*swap*/

当然,这假定函数将始终返回相同的值。