迷宫问题

迷宫问题

http://www.nowcoder.com/questionTerminal/cf24906056f4488c9ddb132f317e03bc

华为机试练习:迷宫问题
利用回溯法进行深度遍历

C代码:

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

static int N=1, M=1, SIZE=1; // 迷宫尺寸

/* 当前行 */
int row(int idx){ return idx/M; }

/* 当前列 */
int col(int idx){ return idx%M; }


/* 是否可以向上移动 */
int hasUP(int* list, int idx){ return row(idx)>0 && 0==list[idx-M]; }

/* 是否可以向左移动 */
int hasLeft(int* list, int idx){ return col(idx)>0 && 0==list[idx-1]; }

/* 是否可以向下移动 */
int hasDown(int* list, int idx){ return row(idx)<N-1 && 0==list[idx+M]; }

/* 是否可以向右移动 */
int hasRight(int* list, int idx){ return col(idx)<M-1 && 0==list[idx+1]; }


/** 输出解迷宫路径
 *    list: 存储迷宫地图的列表 */
void maze(int* list){
    // 初始化
    int bufSize = SIZE+1, idx=0, cnt=0;
    int* buf = (int*)malloc(bufSize * sizeof(int));

    // 未走过:0,走过:-1,死路:1.
    buf[0] = 0; list[0] = -1;
    while(buf[cnt] < SIZE-1){
        // 判断当前位置
        idx = buf[cnt];
        list[idx] = -1;
        if(!hasUP(list, idx) && !hasLeft(list, idx) &&
           !hasDown(list, idx) && !hasRight(list, idx)){
            // 标记死路并原路返回
            cnt--;
            list[idx] = 1;
            continue;
        }

        // 获取下一位置,加入缓冲区
        if(hasUP(list, idx))
            buf[++cnt] = idx-M;
        if(hasLeft(list, idx))
            buf[++cnt]=idx-1;
        if(hasDown(list, idx))
            buf[++cnt]=idx+M;
        if(hasRight(list, idx))
            buf[++cnt]=idx+1;
        // 后续会依照:→ ↓ ← ↑ 的方向顺序进行搜索
    }
    list[SIZE-1] = -1;    // 到达终点

    // 输出路径
    for(int i=0; i<=cnt; i++){
        idx = buf[i];
        if(list[idx]==-1){
            // 输出已路过位置
            printf("(%d,%d)\n", row(idx), col(idx));
        }
    }
}

/* Main */
int main(){
    // 数据读入
    while(scanf("%d %d", &N, &M)!=EOF){
        SIZE = N*M;
        int* list = (int*)malloc(SIZE * sizeof(int));
        for(int i = 0; i<SIZE; i++){
            scanf("%d", &list[i]);
        }
        // 输出解迷宫路径
        maze(list);
        free(list);
    }
    return 0;
}
全部评论

相关推荐

2 2 评论
分享
牛客网
牛客企业服务