CODE[VS]1026 逃跑的拉尔夫

题目:http://codevs.cn/problem/1026/
思路:深度搜索可能的终点,记录每个访问点,防止被二次搜索。
题解:

/* 1026 逃跑的拉尔夫 */
#include <stdio.h>

#define MAXRC   51
#define MAXL    1005  

int r, c;                   /* 小镇地图行,列数 */
char map[MAXRC][MAXRC];     /* 小镇地图存储 */ 
char run_map[MAXRC][MAXRC]; /* 逃跑地图 */ 
int n;                      /* 路径长度 */
char path[MAXL];            /* 路径存储 */ 
int sx, sy;                 /* 初始位置坐标 */
int visited[MAXL][MAXRC][MAXRC];    /* 已访问的状态 */ 

/* 逃跑路径 */
void run(int p, int x, int y){
    int i; 
    /* 判断该状态是否已访问 */
    if(1 == visited[p][x][y]){
        return;
    } 
    else{
        visited[p][x][y] = 1;
    }

    /* 逃跑路径遍历结束,检测位置是否有效 */ 
    if(p > n){
        run_map[x][y] = '*';
    }
    else {
        /* 移动到下一个位置 */
        i = 1;
        switch(path[p]){
            case 'N':   // 北 
                while(y - i >= 1){
                    if(map[x][y - i] == '.'){
                        run(p + 1, x, y - i);
                        i++;
                    }
                    else{
                        break;
                    }
                }
                break;
            case 'S':   //南
                while(y + i <= r){
                    if(map[x][y + i] == '.'){
                        run(p + 1, x, y + i);
                        i++;
                    }
                    else{
                        break;
                    }
                }
                break;
            case 'W':   //西
                while(x - i >= 1){
                    if(map[x - i][y] == '.'){
                        run(p + 1, x - i, y);
                        i++;
                    }
                    else{
                        break;
                    }
                }
                break;
            case 'E':   //东
                while(x + i <= c){
                    if(map[x + i][y] == '.'){
                        run(p + 1, x + i, y);
                        i++;
                    }
                    else{
                        break;
                    }
                }
                break;
            default:
                break;
        } 
    }
} 
/* 主函数人口 */ 
int main(int argc, char *argv[]) {
    int i, x, y;        /* 索引值 */ 
    char str[MAXRC];    /* 字符串输入缓存 */ 
    /* 建立数据文件指针,并打开数据文件 */
    FILE *fp;
    if(NULL == (fp = fopen("data.txt", "r"))){
        return 1;
    }   
    /***********************************/

    /* 读取小镇地图大小 */
    fscanf(fp, "%d %d", &r, &c); 
    /* 获取小镇地图 */
    for(y = 1; y <= r; y++){
        fscanf(fp, "%s", str);
        for(x = 1; x <= c; x++){
            map[x][y] = str[x - 1];
            /* 记录初始位置 */ 
            if('*' == str[x - 1]){
                sx = x;
                sy = y;
            } 
        }
    } 
    /* 获取路径长度 */
    fscanf(fp, "%d", &n);
    /* 获取路径 */
    for(x = 1; x <= n; x++){
        fscanf(fp, "%s", str);
        path[x] = str[0];
    } 
    /* 复制地图到逃跑地图 */
    for(y = 1; y <= r; y++){
        for(x = 1; x <= c; x++){
            run_map[x][y] = map[x][y];
        }
    } 
    /* 初始化路径访问状态 */
    for(i = 1; i <= n; i++){
        for(x = 1; x <= c; x++){
            for(y = 1; y <= r; y++){
                visited[i][x][y] = 0;
            }
        }
    } 
    /* 逃跑路径模拟 */ 
    run_map[sx][sy] = map[sx][sy] = '.';
    run(1, sx, sy);
    /* 打印结果 */
    for(y = 1; y <= r; y++){
        for(x = 1; x <= c; x++){
            printf("%c", run_map[x][y]);
        }
        printf("\n");
    }  
    /* 关闭文件 */
    fclose(fp);
    /***********/ 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/QQ604666459/article/details/78083157
今日推荐