HDU 4452 Running Rabbits 【模拟】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4452


所说这题把我队友坑了好几天。思维有洞呀,我没有想到什么bug去帮他解决。最后也是根据题意直接模拟过的。


#include<cstdio>
#include<algorithm>

using namespace std;

int Map[25][25];
struct Rabbit{
	int x,y;
	int s,t;
	char dir[2];
}ra,rb,ne;//ra,rb两只rabbit和ne表示下一步next 
int n;

void Run(Rabbit k,int s){//先计算出每一刻两只rabbit跑到的地方(假设没墙) 
	ne.x=k.x,ne.y=k.y; 
	if(k.dir[0]=='S') ne.x=k.x+s;
	else if(k.dir[0]=='N') ne.x=k.x-s;
	else if(k.dir[0]=='E') ne.y=k.y+s;
	else ne.y=k.y-s;
}

void Judgedir(Rabbit &k){//判断是否走超过了墙壁 
	if(ne.x>n) k.x=2*n-ne.x,k.dir[0]='N';
	else if(ne.x<1) k.x=2-ne.x,k.dir[0]='S';
	else k.x=ne.x;
	if(ne.y>n) k.y=2*n-ne.y,k.dir[0]='W';
	else if(ne.y<1) k.y=2-ne.y,k.dir[0]='E';
	else k.y=ne.y;
}

void Chdir(Rabbit &k){//左转 
	if(k.dir[0]=='E') k.dir[0]='N';
	else if(k.dir[0]=='W') k.dir[0]='S';
	else if(k.dir[0]=='S') k.dir[0]='E';
	else k.dir[0]='W';
}

int main(){
	int i,tt;
	while(scanf("%d",&n),n){
		scanf("%s%d%d",ra.dir,&ra.s,&ra.t);
		scanf("%s%d%d",rb.dir,&rb.s,&rb.t);
		ra.x=1,ra.y=1;
		rb.x=n,rb.y=n;
		scanf("%d",&tt);
		for(i=1;i<=tt;i++){
			Run(ra,ra.s);//跑一次 
			Judgedir(ra);//判断一次(是否出墙) 
			Run(rb,rb.s);
			Judgedir(rb);
//			printf("%s %s\n",ra.dir,rb.dir);
			if(ra.x==rb.x&&ra.y==rb.y) swap(ra.dir[0],rb.dir[0]);//如果在同一房间 
			else{//不在同一房间 
				if(i%ra.t==0) Chdir(ra);
				if(i%rb.t==0) Chdir(rb);
			}
//			printf("%d %d\n%d %d\n",ra.x,ra.y,rb.x,rb.y);
//			printf("%s %s\n\n",ra.dir,rb.dir);
		}
		printf("%d %d\n%d %d\n",ra.x,ra.y,rb.x,rb.y);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值