poj 2632 第8题

题目链接:http://poj.org/problem?id=2632

思路:本题就是单纯的模拟吧。。。

一直WAWA了好久好久。。。后来找了discuss里的一大堆数据来测!!感觉很不应该错!!!!模拟题的能力还有非常大的提升空间。。。

思路:就是用数组记录每个位置上有哪个机器人,以及记录机器人在哪个位置上,然后模拟。。

感悟:模拟题一定要小心小心仔细仔细·····
第一次wa发现没有考虑到又撞墙又撞到人的情况
第二次发现往右转和往左转写混了····右转漏了
第三次发现有一个dir[num] 打成num 了····,,还有什么位置没有更新之类的
觉得这类题目WA了以后应该更加静心下来仔细检查···而不是一直慌张导致很多小错误找不出来···  不能太过于浮躁了。。要尽力做到考虑周全以及敲代码的时候不遗漏。。这次就有想的时候想到了然后打的时候忘记的情况。。orz
 代码:

#include<cstdio>
#include<cstring>
#define Max 100000
int id[105][105];
int dir[110];
int s[110];
int x,y;
int ob(int p,int q,int m,int time)
{
	int i;
	if(m==1)
	{
		for(i=p+1;i<=p+time;i++)
		if(id[i][q]!=0) return id[i][q];
	}
	else if(m==2)
	{
		for(i=q+1;i<=q+time;i++)
		if(id[p][i]!=0) return id[p][i];
	}
	else if(m==3)
	{
		for(i=p-1;i>=p-time;i--)
		if(id[i][q]!=0) return id[i][q];
	}
	else if(m==4)
	{
		for(i=q-1;i>=q-time;i--)
		if(id[p][i]!=0) return id[p][i];
	}
	return 0;
}
int go(int num,char ch,int time)
{
	int p = s[num] / Max;
	int q = s[num] % Max;
	if(ch == 'L')
	dir[num] = (dir[num]+time%4)%4==0 ? 4 :(dir[num]+time%4)%4 ;
	else if(ch == 'R')
	dir[num] = (dir[num]-time%4)>0 ? dir[num]-time%4:4-(dir[num]-time%4);
	else
	{
		int temp=0;
		id[p][q]=0;
		if(dir[num]==1)
		{
			temp=ob(p,q,dir[num],time);
			if(p+time>x&&!temp) return 101;
			else if(!temp)
			{
				id[p+time][q]=num;
				s[num]=(p+time)*Max+q;
			}
			else return temp;
		}
		else if(dir[num]==2)
		{
			temp=ob(p,q,dir[num],time);
			if(q+time>y&&!temp) return 101;
			else if(!temp)
			{
				id[p][q+time]=num;
				s[num]=p*Max+q+time;
			}
			else return temp;
		}
		else if(dir[num]==3)
		{
			temp=ob(p,q,dir[num],time);
			if(p-time<1&&!temp) return 101;
			else if(!temp)
			{
				id[p-time][q]=num;
				s[num]=(p-time)*Max+q;
			}
			else return temp;
		}
		else if(dir[num]==4)
		{
			temp=ob(p,q,dir[num],time);
			if(q-time<1&!temp) return 101;
			else if(!temp)
			{
				id[p][q-time]=num; 
				s[num]=p*Max+q-time;
			}
			else return temp;
		}
	}
	return 0;
}
int trans (char ch)
{
	if(ch == 'E') return 1;
	if(ch == 'N') return 2;
	if(ch == 'W') return 3;
	if(ch == 'S') return 4;
}
int main ()
{
	int t;
	//FILE* fp=fopen("input.txt","r");
	//FILE* fp2=fopen("output.txt","a");
	scanf("%d",&t);
	while(t--)
	{
		int flag=0;
		memset(id,0,sizeof(id));
		memset(dir,0,sizeof(dir));
		scanf("%d%d",&x,&y);
		int n,m,i;
		scanf("%d%d",&n,&m);
		for(i = 1;i <= n;i++)
		{
			int p,q;
			char ch;
			scanf("%d %d %c",&p,&q,&ch);
			id[p][q] = i;           //记录每个位置上有哪个机器人 
			s[i] = p*Max + q;        //记录下每个机器人的位置 
			dir[i] = trans(ch);
		}
		for(i = 1;i <= m;i++)
		{
			int nn,time;
			char move;
			scanf("%d %c %d",&nn,&move,&time);
			if(flag)  continue;
			int temp=go(nn,move,time);
			if(temp)
			{
				if(temp==101)
				{
					printf("Robot %d crashes into the wall\n",nn);
					flag=1;
				}
				else
				{
					flag=1;
					printf("Robot %d crashes into robot %d\n",nn,temp);
				}
			}
		}
		if(i==m+1&&!flag) printf("OK\n");
	}
	//fclose(fp);
	//fclose(fp2);
	return 0;
}

又看到同学用结构体存储位置和方向。。感觉也是很不错的,我用的是之前在小紫书上看到的将位置化为数值记录下来。。感觉没有结构体方便。。下次记得用结构体。。

附上同学代码:

#include <iostream>
#include <cstring>
using namespace std;
int whouse[105][105],A,B;
struct robot
{
    int x,y,fangxiang;
}r[101];
int move_E(int ra,int step)
{
    int x1=r[ra].x,y1=r[ra].y;
    whouse[x1][y1]=0;
    if(r[ra].fangxiang==0)
    {
        for(int i=1;i<=step;i++)
        {
            if(y1+step>B)
            {
                cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
                return 0;
            }
            if(whouse[x1][y1+i]!=0)
            {
                cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1][y1+i]<<endl;
                return 0;
            }
        }
        whouse[x1][y1+step]=ra;
        r[ra].y=y1+step;
    }
    else if(r[ra].fangxiang==1)
    {
        for(int i=1;i<=step;i++)
        {
            if(x1-step<=0)
            {
                cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
                return 0;
            }
            if(whouse[x1-i][y1]!=0)
            {
                cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1-i][y1]<<endl;
                return 0;
            }
        }
        whouse[x1-step][y1]=ra;
        r[ra].x=x1-step;
    }
    else if(r[ra].fangxiang==2)
    {
        for(int i=1;i<=step;i++)
        {
            if(y1-i<=0)
            {
                cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
                return 0;
            }
            if(whouse[x1][y1-i]!=0)
            {
                cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1][y1-i]<<endl;
                return 0;
            }
        }
        whouse[x1][y1-step]=ra;
        r[ra].y=y1-step;
    }
    else
    {
        for(int i=1;i<=step;i++)
        {
            if(x1+i>A)
            {
                cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
                return 0;
            }
            if(whouse[x1+i][y1]!=0)
            {
                cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1+i][y1]<<endl;
                return 0;
            }
        }
        whouse[x1+step][y1]=ra;
        r[ra].x=x1+step;
    }
    return 1;
}
int main(void)
{
    int K;
    cin>>K;
    while(K--)
    {
        int N,M,ok=1;
        cin>>A>>B>>N>>M;
        memset(whouse,0,sizeof(whouse));
        for(int i=1;i<=N;i++)
        {
            char ch;
            cin>>r[i].x>>r[i].y>>ch;
            if(ch=='N') r[i].fangxiang=0;
            else if(ch=='W') r[i].fangxiang=1;
            else if(ch=='S') r[i].fangxiang=2;
            else r[i].fangxiang=3;
            whouse[r[i].x][r[i].y]=i;
        }
        while(M--)
        {
            int ra,step;
            char order;
            cin>>ra>>order>>step;
            if(!ok) continue;
            if(order=='L')  r[ra].fangxiang=(r[ra].fangxiang+step)%4;
            else if(order=='R')  r[ra].fangxiang=(r[ra].fangxiang+4-step%4)%4;
            else ok=move_E(ra,step);
        }
        if(ok) cout<<"OK"<<endl;
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值