题目: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;
}