广度优先搜索C语言

时间:2015-01-14 21:29:17

标签: c algorithm

我有两个整数列表,例如list_a和list_b。 我有一个函数说func(),而func(list_a)会生成n个列表:

list_a_1   list_a_2  list_a_3   list_a_4 ........... list_a_n

我必须在上面生成的所有列表上运行func(),直到找到其中一个列表= list_b

所以下面可能是列表如何增长的可能表示:

                                 list_a

============================================================================

list_a_1   list_a_2  list_a_3   list_a_4 ........... list_a_n    LEVEL 1

============================================================================

list_a_1_1.... list_a_1_n    list_a_2_1... list_a_2_n.....      LEVEL 2

============================================================================

假设我们找到list_a_1_n == list_b,然后停止该函数并返回LEVEL,在我们的例子中是2(Level2)。

我无法做到:(

如何在C中完成?

请注意,这不是一个家庭作业问题。

我试图在两个输入之间找到Cyclic Kendal Tau距离,因为我认为我在this问题的算法方面找到了解决方案。我想检查一下我的算法是否正确。

下面是Python中的代码:

import collections


def Transpose(alist):
    leveloutput = []
    n = len(alist)
    for i in range(n):
        x=alist[:]
        x[i],x[(i+1)%n] = x[(i+1)%n],x[i]
        leveloutput.append(x)
    return leveloutput


def Cyc_Ken_Tau(start, goal):
    queue = collections.deque([(start, 0)])

    while True:
        element, level = queue.popleft()
        if element == goal:
            return level
        for new_list in Transpose(element):
            queue.append((new_list, level + 1))


if __name__ == '__main__':
    print "***********************************************************"

    u = [2, 3, 4, 1]
    v = [1, 2, 4, 3]

    print "***********************************************************"

    m = Cyc_Ken_Tau(u,v)
    print "Cyclic Kendal Tau:",m

C中的部分代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void print_array(int **a, int num_elements);
int **transpose(int n, int arr[n]);

int main(){
    int a[] = {2, 3, 4, 1};
    int **c;
    int n = sizeof(a)/sizeof(*a);
    int i;
    printf("original\n");
    print_array2(a,4);
    printf("\n*****************************\n");
    c= transpose(n, a);
    print_array(c, n);
    //deallocate
    for(i=0;i<n;++i)
        free(c[i]);
    free(c);
    return 0;
}

int **transpose(int n, int arr[n]){
    int l = n;
    int **b = malloc(l * sizeof(*b));//sizeof(*b) : sizeof(int *)
    int i, j, k;
    for (i = 0; i < l; i++) {
        j = (i + 1) % l;
        int *copy = malloc(l * sizeof(*copy));//sizeof(int)
        for (k = 0; k < l; k++)
            copy[k] = arr[k];
        int t = copy[i];
        copy[i] = copy[j];
        copy[j] = t;
        //printf("{%d, %d, %d, %d}\n", copy[0], copy[1], copy[2], copy[3]);
        b[i] = copy;
    }
    return b;
}

void print_array(int **a, int num_elements){
    int i, j;
    for(i=0; i<num_elements; i++){
        for(j=0; j<num_elements; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
}

void print_array2(int a[], int num_elements)
{
   int i;
   for(i=0; i<num_elements; i++)
   {
     printf("%d ", a[i]);
   }
   printf("\n");
}

但我正在努力克服C中的 Cyc_Ken_Tau 功能。任何帮助都会非常感激。

0 个答案:

没有答案