我正在编写一些可以找到以下问题的最佳答案的内容:
你有一个整数向量,你必须通过做"翻转"操作,也就是说,给定大小为n的向量中的i位置,你应该切换i和n-1的值,i + 1和n-2的值,依此类推。目标是找到并将矢量按顺序排列的最佳方式,即最小翻转次数
我决定使用A *算法来找到答案,因为找到最佳答案很重要,并且存储我需要的所有信息,我选择使用以下结构:
typedef struct{
int *v, *flips,g, h;
} node;
其中v将是解决方案的状态,翻转将存储我的选择,g将保存g函数的值,并且h是启发式的值。
因此,为了编写程序,我制作了一个节点类型的向量,如下所示:
estados=malloc(n*sizeof(node));
并且想法是使用节点向量的每个位置来存储状态,以便可以进行比较和扩展等。在大多数情况下,编译器并没有抱怨,但在这些函数中:
int funcaoh(node estados,int n,int goal[], int pos){
int cont=0, i;
for(i=0;i<n;i++){
if(estados[pos].v[i]!=goal[i]){
cont++;
}
}
return (cont/2);
}
void criaNode(node x[], int n, int pos){
int i;
x[pos].v =malloc(n*sizeof(int));
x[pos].flips =malloc(n*sizeof(int));
for(i=0;i<n;i++){
x[pos].flips[i]=-1;
x[pos].v[i]=-1;
}
x[pos].h=0;
x[pos].g=0;
return;
}
我收到错误&#34;错误:下标值既不是数组也不是指针,也不是向量&#34;在funcaoh函数的if语句和&#34;警告:内置函数&malloc&#39;不兼容的隐式声明中。 [默认启用]&#34;在第一个 malloc 语句上发出警告,但在第二个奇怪的情况下没有警告。在另外几个类似的代码实例中也会发生同样的情况,我怀疑warnig可能只是以错误的方式使用 malloc ,因为我在其他地方得到了同样的警告,而不是#&# 39;这是一个问题,如:
entrada=malloc(n * sizeof(int));
但主要的是让结构向量工作,因为它显然是程序成功的必要组成部分。如果我猜测,我想它与使用struct作为向量有关,也许它不像我认为的那样工作?但我不知道。
P.S。我是巴西人,所以代码的某些部分是用葡萄牙语写的,大多数只是变量和函数的名称,如果有必要我可以翻译它们。
答案 0 :(得分:2)
在funcaoh()
:
int funcaoh(node estados,int n,int goal[], int pos){
estados
是一个简单的结构,而不是指向结构的指针,所以你不能下标它等等。这就是编译器所说的;我不得不同意。
你可能需要其中一种(它们相当):
int funcaoh(node *estados, int n, int goal[], int pos) { … }
int funcaoh(node estados[], int n, int goal[], int pos) { … }