题目描述
有一个 10 x 10 的迷宫,起点是‘S’,终点是‘E’,墙是‘#’,道路是空格。一个机器人从起点走到终点。当机器人走到一个通道块,前面已经没有路可走时,它会转向到当前方块的右手方向继续走。如果机器人能够过,则留下足迹‘*’,如果走不通,则留下标记‘!’。
下面给出书中的算法,请你模拟机器人的走法输出最终的状态。
图:迷宫算法
输入
一个 10 x 10 的二维字符数组。
输出
机器人走过的路径状态。
样例输入 Copy
##########
#S # # #
# # # #
# ## #
# ### #
# # #
# # # #
# ### ## #
## E#
##########
样例输出 Copy
##########
#**#!!!# #
# *#!!!# #
#**!!## #
#*### #
#***# #
# #***# #
# ###*## #
## ****#
##########
#include"stdio.h"
#define OK 1
#define ERROR 0
char map[11][11];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int dfs(int x,int y)
{
int i,nextx,nexty;
if(map[x][y]=='E')
{
map[x][y]='*';
return OK;
}
for(i=0;i<4;i++)
{
nextx=dir[i][0]+x;
nexty=dir[i][1]+y;
if(map[nextx][nexty]==' ')
{
map[nextx][nexty]='*';
return dfs(nextx,nexty);
}
else if(map[nextx][nexty]=='E')
{
map[nextx][nexty]='*';
return OK;
}
}
map[x][y]='!';
for(i=0;i<4;i++)
{
nextx=dir[i][0]+x;
nexty=dir[i][1]+y;
if(map[nextx][nexty]=='*')
return dfs(nextx,nexty);
}
}
int main()
{
int i,j,x,y,q,p;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
map[i][j]=getchar();
if(map[i][j]=='S')
{
x=i;
y=j;
}
if(map[i][j]=='E')
{
q=i;
p=j;
}
}
getchar();
}
map[x][y]='*';
dfs(x,y);
if(map[q][p]!='E')
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
putchar(map[i][j]);
printf("\n");
}}
else
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(map[i][j]=='*')
putchar('!');
else
putchar(map[i][j]);
}
printf("\n");
}
}
}