POJ2632

POJ原址:POJ2632

每次写CSDN文的时候最幸福快乐了~

这题真是太晕了,现在都还不确定有些 if 是不是必要,反正很晕很晕,不清白。

参考链接:

POJ2632-Crashing Robots - ζёСяêτ - 小優YoU - 博客频道 - CSDN.NET

Crashing Robots POJ2632 - 天堂人间 - 博客频道 - CSDN.NET

这两个链接的程序都没怎么参考,第一个主要是让我开始想到用flag来记录,之前一直直接输出,每次发出指令都会输出,差点疯掉。

第二个的程序感觉写得估计应该是非常清晰,可惜自己压根没看。

上一篇的时候说过,想要试着自己不照着攻略写程序,于是就导致在不会的时候想看别人的找点思路也完全看不懂了,不同的人变量设定的都不一样,而且各种方法各种东西完全都不同,很难照着别人的来,本来差点都打算重新按照第二个链接的思路再写一个新的,可是还好没有,终于感动天感动地感动oj…

还有就是之前特傻逼的直接用了题目输出的"Robot 1 crashes into the wall"和"Robot 1 crashes into robot 2",丫的又不是只有两个robot而已,傻啊。

必须谢谢测试数据,让我能一个一个坐标输出来检验:测试数据



程序:

#include<iostream>
using namespace std;
int main()
{
	int k;
	cin>>k;
	while(k--)
	{
		int a,b,m,n,i,j,k,flag=0,crash=0;
		int num,times,crashed=0;
		int map[100][100],robot_a[100],robot_b[100],direc[100];//direc应该是个二维数组,行数表示第几个机器人,列数表示它的第几次指令过后的direc 
		char direc_temp;
		memset(map,0,sizeof(map));
		memset(robot_a,0,sizeof(robot_a));
		memset(robot_b,0,sizeof(robot_b));
		memset(direc,0,sizeof(direc));
		cin>>a>>b>>n>>m;
		for(i=1;i<=n;i++)
		{
			cin>>robot_a[i]>>robot_b[i]>>direc_temp;
			switch(direc_temp)
			{
				case 'E': direc[i]=0;break;//第i个robot初始的方向 
				case 'N': direc[i]=1;break;
				case 'W': direc[i]=2;break;
				case 'S': direc[i]=3;break;
				default: direc[i]=-1;
			}
			map[robot_a[i]][robot_b[i]]=1;
		}
		
		for(j=1;j<=m;j++) //遍历每一次instruction 
		{
			char ordor;
			cin>>num>>ordor>>times; 
			switch(ordor)
			{
				case 'F': break;
				case 'R': direc[num]=(direc[num]+2000-times)%4;break;
				case 'L': direc[num]=(direc[num]+times)%4;break;
				default:direc[num]=-1;
			}
			if(ordor=='F')
			{
				for(k=1;k<=times;k++)
				{
					if(flag==0)
					{
						map[robot_a[num]][robot_b[num]]=0;
						switch(direc[num])//对第num号robot进行一次操作,朝着direc[num]的方向,只改变坐标
						{
							case 0: robot_a[num]++;break;
							case 1: robot_b[num]++;break;
							case 2: robot_a[num]--;break;
							case 3: robot_b[num]--;break;
						}//注意此时坐标已经完成改变了,但是map上的值还并没有变
						//cout<<"a[]b[]"<<robot_a[num]<<' '<<robot_b[num]<<endl;用这些语句查错查了好久
						//cout<<map[robot_a[num]][robot_b[num]]<<endl;
						if(map[robot_a[num]][robot_b[num]]==1)//如果这一位有值了,遍历n个robot找是第几个
						{
							for(i=1;i<=n;i++)
							{
								//cout<<"i="<<i<<endl;
								//cout<<"robot[][]"<<robot_a[i]<<' '<<robot_b[i]<<endl;
								if(robot_a[i]==robot_a[num]&&robot_b[i]==robot_b[num]&&i!=num) //这个i!=num找了可不是一点久
								crashed=i; //robot i is crashed
							}
							crash=num;
							flag=1;
							//!!!应该这样,做一个标记,表示已经出来了,可以在这里就输出了,但是下一个循环的时候如果这一次已经出来了的话就不再进行
						}
						else if(robot_a[num]<1||robot_a[num]>a||robot_b[num]<1||robot_b[num]>b)
						{
							crash=num;
							flag=2;
						}
					}
					map[robot_a[num]][robot_b[num]]=1;
				}
			}
		}
		if(flag==1)
		cout<<"Robot "<<crash<<" crashes into robot "<<crashed<<endl;
		if(flag==2)
		cout<<"Robot "<<crash<<" crashes into the wall"<<endl;
		if(flag==0)
		cout<<"OK"<<endl;
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值