注解
1、模拟。上下左右四个方位。用数组来表示。
2、DFS,深度优先遍历,出口有两个,第一个是越过边界,第二个是造成循环圈。
代码
#include <iostream>
#include <cstring>
using namespace std;
int a, b, c;
char ch[20][20];
int visit[20][20];
int step;
void dfs(int x, int y){
if(x<1 || y<1 || x>a || y>b){
cout<<step<<" step(s) to exit"<<endl;
return;
}
if(visit[x][y]){
cout<<(visit[x][y]-1)<<" step(s) before a loop of "<<(step-visit[x][y]+1)<<" step(s)"<<endl;
return;
}
if(ch[x][y]=='N'){
step++;
visit[x][y] = step;
dfs(x-1, y);
}
if(ch[x][y]=='S'){
step++;
visit[x][y] = step;
dfs(x+1, y);
}
if(ch[x][y]=='W'){
step++;
visit[x][y] = step;
dfs(x, y-1);
}
if(ch[x][y]=='E'){
step++;
visit[x][y] = step;
dfs(x, y+1);
}
}
int main(){
cin>>a>>b;
while(a || b){
cin>>c;
memset(visit, 0, sizeof(visit));
for(int i=1; i<=a; i++){
for(int j=1; j<=b; j++){
cin>>ch[i][j];
}
}
step = 0;
dfs(1, c);
cin>>a>>b;
}
return 0;
}