题目的意思就是给一个初始位置,按着指示往下走,计算出走出方格的步数 或者遇到循环的圈子计算圈子的步数和到达圈子的步数
#include <iostream>
using namespace std;
struct node
{
char instr; //指示方向
int step; //步骤
};
node Arr[11][11];
int iN,iM,istart_pos; //row,column,开始位置
int ipath_steps; //路径步数
int iloop_steps; //循环步数
void Export()
{
for(int i = 1; i <= iN; i++)
{
for(int j = 1; j <= iM; j++)
{
cin>>Arr[i][j].instr;
Arr[i][j].step = 0;
}
}
}
void Next_pos(int& a,int& b)//走下一位置
{
switch(Arr[a][b].instr)
{
case 'N':
a = a - 1;
break;
case 'S':
a = a + 1;
break;
case 'E':
b = b + 1;
break;
case 'W':
b = b - 1;
break;
default:
break;
}
}
bool isborder(int x,int y)//判断是否在grid中
{
if(x < 1 || x > iN || y < 1 || y > iM)
{
return false;//不在grid内
}
return true; //在grid内
}
void DFS(int x,int y)
{
int a = x;
int b = y;
Next_pos(a,b); //a和 b是下一个位置
if(!isborder(a,b))//不在网格内了 直接打印
{
cout<<Arr[x][y].step + 1<<" step(s) to exit"<<endl;
return;
}
if(Arr[a][b].step != 0)//只要这个不等于零 就表明进入了圈子
{
ipath_steps = Arr[a][b].step;
iloop_steps = Arr[x][y].step - Arr[a][b].step + 1;
if(ipath_steps == 1)//这个地方错了一次 注意当步数为1时这要特殊处理
ipath_steps = 0;
cout<<ipath_steps<<" step(s) before a loop of "<<iloop_steps<<" step(s)"<<endl;
return;
}
Arr[a][b].step = Arr[x][y].step + 1;
DFS(a,b);
}
int main()
{
while(cin>>iN>>iM>>istart_pos,iN !=0 && iM != 0 && istart_pos != 0)
{
Export(); //输出数据函数
DFS(1,istart_pos);
}
return 0;
}