Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63094
  • 博文数量: 30
  • 博客积分: 1456
  • 博客等级: 上尉
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-08 22:31
文章分类

全部博文(30)

文章存档

2011年(1)

2008年(29)

我的朋友
最近访客

分类: LINUX

2008-12-09 00:47:20

/*
  *  平台: Debian 5.0
 *  编译器:gcc version 4.3.2 (Debian 4.3.2-1)
 *  任何问题联系:goon83@126.com
 */

#include

#define MAXN        6
#define MAXSTATE 120        //在迭代过程中的最多的状态数量(5 * 4 * 3 * 2 * 1)
#define TRUE         1
#define FALSE        0
#define DELETE      1000     //设置一个足够大的数来表示删除当前结点

struct StateStruct{
    int CurNode;                   //当前的结点
    int LeftNode[MAXN -1];   //最多有 (MAXN -1)个未访问的结点
    int LeftNodeCount;          //记录LeftNode数组的长度
    int Dis;                           //从该结点回到目标节点的距离
};

typedef struct StateStruct State;

//最多有MAXSTATE个状态。
State   StateArrayCur[MAXSTATE];
State   StateArrayOld[MAXSTATE];


int Dis[MAXN][MAXN] ={
    0, 10, 20, 30, 40, 50,
        12, 0 ,18, 30, 25, 21,
        23, 19, 0, 5,  10, 15,
        34, 32, 4, 0,  8,  16,
        45, 27, 11,10, 0,  18,
        56, 22, 16,20, 12,  0
};

/*
 *比较两个状态TempState, TargetState是否一致
 *返回: TRUE  两个状态一致,可以合并
 *           FALSE 两个状态不一致, 不可以合并
 */
int CompareState(State TempState, State TargetState){
    int i;
   
    if (TempState.CurNode != TargetState.CurNode){
        return FALSE;
    }
   

    for (i = 0; i < TempState.LeftNodeCount; i ++){
        if((Contain(TargetState, TempState.LeftNode[i]) == FALSE)){
            return FALSE;
        }       
    }

    return TRUE;
   
}

/*
 *判断当前状态 TempState是否包含结点 j
 *返回: TRUE  状态包含 j
 *           FALSE 状态不包含 j
 */
int Contain(State TempState, int j){
    int i;
    if (TempState.CurNode == j){
        return TRUE;
    }

    for (i = 0; i < TempState.LeftNodeCount; i++){
        if (TempState.LeftNode[i] == j){
            return TRUE;
        }   
    }

    return FALSE;
}
/*
 *合并在当前阶段中可以合并的状态,
 *      在该阶段中状态的初始的个数为Index,
 *      合并后剩下的状态数量为NewStateCount
 */
int Combine(int Index){
    int      left, k;
    State NewStateArray[MAXSTATE];                    //临时用来记录合并后的状态
    int     NewStateCount;                                     //合并后状态的数量
    State MinState;
    NewStateCount = 0;

   
    for (left = 0; left < Index; left++){                 //从左到右发现一个新的状态
        if (StateArrayCur[left].CurNode != DELETE){
            MinState = StateArrayCur[left];
            StateArrayCur[left].CurNode = DELETE;   //-1表示从StateCur中删掉
       
       
            int i;
            for (i = left+1; i < Index; i++){ // 合并相同的状态
                if (CompareState(MinState, StateArrayCur[i]) == TRUE){
                    if (MinState.Dis > StateArrayCur[i].Dis){
                        MinState = StateArrayCur[i];
                    }               
               
                    StateArrayCur[i].CurNode = DELETE;       //-1表示从StateCur中删掉   
                }           
            }
            NewStateArray[NewStateCount] = MinState;
            NewStateCount = NewStateCount + 1;
       
        }   
    }           


    for ( k =0; k < NewStateCount; k++){
        StateArrayCur[k] = NewStateArray[k];   
    }
   
    return NewStateCount;
}

int  main(int argc, char *argv[]){
    int i, MinLength, MinIndex, TempLength;
    int p, NewStateCount;
   
    //每个节点回到起始点的距离
    for( i= 1;  i < MAXN  ; i ++){               
        StateArrayCur[i-1].CurNode = i;
        StateArrayCur[i-1].LeftNodeCount = 0;
        StateArrayCur[i-1].Dis   = Dis[i][0];
    }

    NewStateCount = MAXN - 1;
    //开始迭代MAXN-2次
    for (i = 1; i <=(MAXN - 2); i++){
        for (p = 0; p < NewStateCount;  p++ ){
            StateArrayOld[p] = StateArrayCur[p];
            //if ( NewStateCount == 20)
            //    printf("%d \n", StateArrayOld[p].Dis);   
        }

        int index , j;
        index = 0;

        for(  j = 1; j < MAXN; j++){
            int r, k;
            for(k = 0 ; k < NewStateCount; k++){
                if ((Contain(StateArrayOld[k], j) == FALSE)){     //如果原状态中不包括 j . 则增加一个新状态包含(j, 原状态)
                    StateArrayCur[index] = StateArrayOld[k];
                    StateArrayCur[index].LeftNode[ StateArrayOld[k].LeftNodeCount] = StateArrayOld[k].CurNode;
                    StateArrayCur[index].LeftNodeCount =StateArrayOld[k].LeftNodeCount + 1;
                    StateArrayCur[index].Dis  = StateArrayOld[k].Dis + Dis[j][StateArrayOld[k].CurNode];
                    StateArrayCur[index].CurNode = j;

                    index = index + 1;
                }
            }
        }


        if (i != 1){       
            NewStateCount = Combine(index);                //选择相同状态中最小的记录下来       
        }else{
            NewStateCount = index;                                               //第一次的迭代不用合并
        }

    }
   

    MinLength  = StateArrayCur[0].Dis + Dis[0][StateArrayCur[0].CurNode];
    MinIndex = 0;

    for(i = 1 ; i < MAXN - 1; i++){
        TempLength =StateArrayCur[i].Dis + Dis[0][StateArrayCur[i].CurNode];
        if (TempLength < MinLength){
            MinIndex  = i;
            MinLength = TempLength;
        }
    }
   
    printf("Shortest distance: %d \n", MinLength);
    printf("Path : ",MinIndex);
    printf(" 1 ");
    printf(" %d ", StateArrayCur[MinIndex].CurNode + 1);
    for (i = MAXN - 3; i >= 0; i--){
        printf(" %d ", (StateArrayCur[MinIndex].LeftNode[i] + 1));
    }
    printf(" 1 \n");
    return 0;
}

阅读(1358) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~