POJ 1573【Robot Motion】

13 篇文章 0 订阅
10 篇文章 0 订阅

题目链接

思路:

  • 模拟,有一个坑。
  • 实际上这个坑是很好想到的,我也确实想到了,但是没有深入根据程序一步步走,还是通过看题解才明白。
  • 动手组一个对应样例看一看,说不定就会轻松的解决问题,固执没什么好结果。

代码:

  • WA代码:
#include <iostream>
#include <cstring>

using namespace std;

const int maxn = 15;

int M,N;
int t;
char ins[maxn][maxn];//instruction
int  mp [maxn][maxn];//step
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]){
                //坑点在于,如果回路包含了入口,第一次入口实际上置了零,程序以为这里没有走过,会在再下一个点判环
		//这样,t 就是第二个点的 mp 值也就是 1,loop 是正确的。

		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;
}
  • AC代码:652K 0MS
//652K		0MS


#include <iostream>
#include <cstring>

using namespace std;

const int maxn = 15;

int M,N;
int t;
char ins[maxn][maxn];//instruction
int  mp [maxn][maxn];//step
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值