思路:
- 模拟,有一个坑。
- 实际上这个坑是很好想到的,我也确实想到了,但是没有深入根据程序一步步走,还是通过看题解才明白。
- 动手组一个对应样例看一看,说不定就会轻松的解决问题,固执没什么好结果。
代码:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 15;
int M,N;
int t;
char ins[maxn][maxn];
int mp [maxn][maxn];
int loop;
bool suc;
void init(){
t = 0;
memset(mp , 0 , sizeof(mp));
return ;
}
void Move(int x ,int y){
if(x<1 || y<1 || x>M || y>N){
suc = true;
return ;
}
if(mp[x][y]){
loop = t - mp[x][y];
t = mp[x][y];
suc = false;
}
else{
mp[x][y] = t++;
switch(ins[x][y])
{
case 'E' : Move(x , y+1);break;
case 'N' : Move(x-1 , y);break;
case 'W' : Move(x , y-1);break;
case 'S' : Move(x+1 , y);break;
}
}
return ;
}
int main(){
while(true){
int s;
cin>>M>>N>>s;
if(M+N+s == 0)
break;
init();
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++)
cin>>ins[i][j];
Move(1 , s);
if(suc)
cout<<t<<" step(s) to exit"<<endl;
else
cout<<t<<" step(s) before a loop of "<<loop<<" step(s)"<<endl;
}
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 15;
int M,N;
int t;
char ins[maxn][maxn];
int mp [maxn][maxn];
int loop;
bool suc;
void init(){
t = 0;
memset(mp , 0 , sizeof(mp));
return ;
}
void Move(int x ,int y){
if(x<1 || y<1 || x>M || y>N){
suc = true;
return ;
}
if(mp[x][y]>0){
loop = t - mp[x][y];
t = mp[x][y];
suc = false;
}
else if(mp[x][y]){
loop = t;
t = 0;
suc = false;
}
else{
if(!t){
mp[x][y] = -1;
t++;
}
else
mp[x][y] = t++;
switch(ins[x][y])
{
case 'E' : Move(x , y+1);break;
case 'N' : Move(x-1 , y);break;
case 'W' : Move(x , y-1);break;
case 'S' : Move(x+1 , y);break;
}
}
return ;
}
int main(){
while(true){
int s;
cin>>M>>N>>s;
if(M+N+s == 0)
break;
init();
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++)
cin>>ins[i][j];
Move(1 , s);
if(suc)
cout<<t<<" step(s) to exit"<<endl;
else
cout<<t<<" step(s) before a loop of "<<loop<<" step(s)"<<endl;
}
return 0;
}