这里我只测试了该题发生的循环部分,非循环部分难度比较低,用该代码改进后就可运行。我计算出总的步数count和进入循环点之前的步数loopcount,两者相减就是循环步数。
#include <iostream>
#include <stack>
using namespace std;
int m,n,i,j;
int count=0;
int countloop=0;
int flag[4][5];//记录经过的位置
int y[4]={0,0,-1,1};//记录横坐标的变化
int x[4]={-1,1,0,0};//记录纵坐标的变化
char local[4][5]={
{'S','E','S','W','E'},
{'E','E','S','N','W'},
{'N','W','E','E','N'},
{'E','W','S','E','N'}
};
void cal(int ini,int inj)
{
i=ini;
j=inj;
while(i>=0&&i<4&&j>=0&&j<5)
{
if(flag[i][j]==0)
{
flag[i][j]=1;
count++;
if(local[i][j]=='N')//up
{
i=i+x[0];
j=j+y[0];
}
else if(local[i][j]=='S')//down
{
i=i+x[1];
j=j+y[1];
}
else if(local[i][j]=='W')//left
{
i=i+x[2];
j=j+y[2];
}
else if(local[i][j]=='E')//right
{
i=i+x[3];
j=j+y[3];
}
}
else
break;
}
}
void main()
{
//初始化
int loopi=0,loopj=0;
memset(flag,0,sizeof(flag));//清零
cal(0,0);
cout<<i<<' '<<j<<endl;
cout<<count<<endl;
while((loopj!=j)||(loopi!=i))
{
countloop++;
if(local[loopi][loopj]=='N')//up
{
loopi=loopi+x[0];
loopj=loopj+y[0];
}
else if(local[loopi][loopj]=='S')//down
{
loopi=loopi+x[1];
loopj=loopj+y[1];
}
else if(local[loopi][loopj]=='W')//left
{
loopi=loopi+x[2];
loopj=loopj+y[2];
}
else if(local[loopi][loopj]=='E')//rloopight
{
loopi=loopi+x[3];
loopj=loopj+y[3];
}
}
cout<<loopj<<' '<<loopi<<endl;
cout<<countloop;
}