您的位置:首页 > 其它

CODE[VS]1026 逃跑的拉尔夫

2017-09-25 11:12 369 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: