杭电ACM 1035

这里我只测试了该题发生的循环部分,非循环部分难度比较低,用该代码改进后就可运行。我计算出总的步数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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值