poj.2632模拟

本题的意思是:给定一个a*b的矩阵,矩阵中的n个机器在矩阵中的位置和方位,m个步骤,每个步骤分为机器的序号+步骤的种类+步骤执行的次数,要求刚开始时机器不能重合,即给定的位置不能相等,并且每个指令时依次完成的,不能同时执行两个指令,而指令种类分L:向左转90度,R:向右转90度;F:向前行进一步,即一个方格。现要求判断执行所有步骤的时候是否有相撞或撞墙,如果有则输出结束,否则就输出“OK",这道题目其实思路很简单,就是一步一步的执行所给的步骤,麻烦就在于方向和指令各不同,那么每执行一个步骤就组合出4(方向)*3(指令的种类)种可能,另外就是判断在执行前进步骤过程中是否碰到了其他机器,这也是难点,至于其他两种指令只需要对4取余,然后相应改成转向后的方向即可可,这道题目的核心就是模拟题目中的步骤。

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 100
struct Pos{
	int x,y;
	char dir;
};
struct Req{
	int number;
	int time;
	char step;
};
Pos pos[Max];
Req req[Max];
int k;
int a,b;
int n,m;
bool trag;
bool record[Max+1][Max+1];
int main()
{
	scanf("%d",&k);
	while(k--){
		scanf("%d%d%d%d",&a,&b,&n,&m);
		int i,j,index;
		memset(record,false,sizeof(record));
		for(i=0;i<n;i++){
			scanf("%d%d %c",&pos[i].x , &pos[i].y , &pos[i].dir);
			record[pos[i].x][pos[i].y]=true;
		}
		for(i=0;i<m;i++)
			scanf("%d %c%d",&req[i].number,&req[i].step,&req[i].time);
		trag=true;
		for(i=0;i<m;i++){
			if(!trag)
				break;
			int num=req[i].number;
			int t=req[i].time;
			switch(pos[num-1].dir)
			{
	//==================================			
			case 'N':
				switch(req[i].step)
				{
				case 'L':
					switch(t%4)
					{
				case 1:pos[num-1].dir='W';break;
				case 2:pos[num-1].dir='S';break;
			case 3:pos[num-1].dir='E';break;
					}
					break;
					
			case 'R':
				switch(t%4)
					{
				case 1:pos[num-1].dir='E';break;
				case 2:pos[num-1].dir='S';break;
			case 3:pos[num-1].dir='W';break;
					}
					break;
					
		case 'F':
			if(pos[num-1].x<=0 || pos[num-1].x>=a+1 || pos[num-1].y+t<=0 || pos[num-1].y+t>=b+1){
				for(j=pos[num-1].y+1;j<=b;j++)
					if(record[pos[num-1].x][j])
						break;
					if(j<=b){
						for(index=0;index<n;index++)
					if(pos[index].x==pos[num-1].x && pos[index].y==j){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
					}
					}
					else{
					printf("Robot %d crashes into the wall\n",num);
				    trag=false;
					}	
			}
			else{
				for(j=pos[num-1].y+1;j<=pos[num-1].y+t;j++)
					if(record[pos[num-1].x][j])
						break;
				     if(j<=pos[num-1].y+t){
					  for(index=0;index<n;index++)
					    if(pos[index].x==pos[num-1].x && pos[index].y==j){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
						}
					 }
				     else{
						 record[pos[num-1].x][pos[num-1].y]=false;
				         record[pos[num-1].x][pos[num-1].y+t]=true;
				         pos[num-1].y+=t;
					 }
			}
						break;
				}	
			break;
		//==========================================	
			case 'S':
					switch(req[i].step)
				{
				case 'L':
					switch(t%4)
					{
				case 1:pos[num-1].dir='E';break;
				case 2:pos[num-1].dir='N';break;
			case 3:pos[num-1].dir='W';break;
					}
					break;
					
			case 'R':
				switch(t%4)
					{
				case 1:pos[num-1].dir='W';break;
				case 2:pos[num-1].dir='N';break;
			case 3:pos[num-1].dir='E';break;
					}
					break;
					
		case 'F':
			/*if(pos[num-1].x==0 || pos[num-1].x==a+1 || pos[num-1].y-t==0 || pos[num-1].y-t==b+1){
				printf("Robot %d crashes into the wall\n",num);
				trag=false;
			}
			else if(record[pos[num-1].x][pos[num-1].y-t]==true){
				for(j=0;j<n;j++)
					if(pos[j].x==pos[num-1].x && pos[j].y==pos[num-1].y-t)
						break;
				printf("Robot %d crashes into robot %d\n",num,j+1);
				trag=false;
			}
			else{
				record[pos[num-1].x][pos[num-1].y]=false;
				record[pos[num-1].x][pos[num-1].y-t]=true;
				pos[num-1].y-=t;
			}*/
			if(pos[num-1].x<=0 || pos[num-1].x>=a+1 || pos[num-1].y-t<=0 || pos[num-1].y-t>=b+1){
				for(j=pos[num-1].y-1;j>=1;j--)
					if(record[pos[num-1].x][j])
						break;
					if(j>=1){
						for(index=0;index<n;index++)
					if(pos[index].x==pos[num-1].x && pos[index].y==j){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
					}
					}
					else{
					printf("Robot %d crashes into the wall\n",num);
				    trag=false;
					}	
			}
			else{
				for(j=pos[num-1].y-1;j>=pos[num-1].y-t;j--)
					if(record[pos[num-1].x][j])
						break;
				     if(j>=pos[num-1].y-t){
					  for(index=0;index<n;index++)
					    if(pos[index].x==pos[num-1].x && pos[index].y==j){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
						}
					 }
				     else{
						 record[pos[num-1].x][pos[num-1].y]=false;
				         record[pos[num-1].x][pos[num-1].y-t]=true;
				         pos[num-1].y-=t;
					 }
			}
			break;
				}
				break;
		//====================================		
			case 'W':
					switch(req[i].step)
				{
				case 'L':
					switch(t%4)
					{
				case 1:pos[num-1].dir='S';break;
				case 2:pos[num-1].dir='E';break;
			case 3:pos[num-1].dir='N';break;
					}
					break;
					
			case 'R':
				switch(t%4)
					{
				case 1:pos[num-1].dir='N';break;
				case 2:pos[num-1].dir='E';break;
			case 3:pos[num-1].dir='S';break;
					}
					break;
					
		case 'F':
			if(pos[num-1].x-t<=0 || pos[num-1].x-t>=a+1 || pos[num-1].y<=0 || pos[num-1].y>=b+1){
				for(j=pos[num-1].x-1;j>=1;j--)
					if(record[j][pos[num-1].y])
						break;
					if(j>=1){
						for(index=0;index<n;index++)
					if(pos[index].x==j && pos[index].y==pos[num-1].y){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
					}
					}
					else{
					printf("Robot %d crashes into the wall\n",num);
				    trag=false;
					}	
			}
			else{
				for(j=pos[num-1].x-1;j>=pos[num-1].x-t;j--)
					if(record[j][pos[num-1].y])
						break;
				     if(j>=pos[num-1].x-t){
					  for(index=0;index<n;index++)
					    if(pos[index].x==j && pos[index].y==pos[num-1].y){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
						}
					 }
				     else{
						 record[pos[num-1].x][pos[num-1].y]=false;
				         record[pos[num-1].x-t][pos[num-1].y]=true;
				         pos[num-1].x-=t;
					 }
			}
			break;
				}
				break;
		//==================================
			case 'E':
					switch(req[i].step)
				{
				case 'L':
					switch(t%4)
					{
				case 1:pos[num-1].dir='N';break;
				case 2:pos[num-1].dir='W';break;
			case 3:pos[num-1].dir='S';break;
					}
					break;
					
			case 'R':
				switch(t%4)
					{
				case 1:pos[num-1].dir='S';break;
				case 2:pos[num-1].dir='W';break;
			case 3:pos[num-1].dir='N';break;
					}
					break;
					
		case 'F':
			if(pos[num-1].x+t<=0 || pos[num-1].x+t>=a+1 || pos[num-1].y<=0 || pos[num-1].y>=b+1){
				for(j=pos[num-1].x+1;j<=a;j++)
					if(record[j][pos[num-1].y])
						break;
					if(j<=a){
						for(index=0;index<n;index++)
					if(pos[index].x==j && pos[index].y==pos[num-1].y){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
					}
					}
					else{
					printf("Robot %d crashes into the wall\n",num);
				    trag=false;
					}	
			}
			else{
				for(j=pos[num-1].x+1;j<=pos[num-1].x+t;j++)
					if(record[j][pos[num-1].y])
						break;
				     if(j<=pos[num-1].x+t){
					  for(index=0;index<n;index++)
					    if(pos[index].x==j && pos[index].y==pos[num-1].y){
						printf("Robot %d crashes into robot %d\n",num,index+1);
				        trag=false;
						}
					 }
				     else{
						 record[pos[num-1].x][pos[num-1].y]=false;
				         record[pos[num-1].x+t][pos[num-1].y]=true;
				         pos[num-1].x+=t;
					 }
			}
			break;
				}
				break;
			}
		}
		if(trag)
			printf("OK\n");
	}
	return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值