pku 2623 Crashing Robots 第一周训练——模拟

http://poj.org/problem?id=2632

唉。。做模拟题一定要细心啊。才开始自己吧题意读错了,以为向左右转后还要走呢。调了很长时间还是没有过样例,最后又看了一遍题目才发现,原来是原地打转。悲剧啊。

还有就是对于tagp[a].mark的判断,if 必须配有els否则上一步对mark的改变会影响到下一步的处理。唉。。。这样的小错误在模拟题中是很难检查的。。唉。。费劲啊。

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 10007
using namespace std;
int flag;
struct node
{
int x,y;
char mark[2];
}tagp[maxn];
int nb,mb;
int iscrash(int a)
{
for (int i = 1; i <= nb; ++i)
{
if ((i != a) && (tagp[a].x == tagp[i].x) && (tagp[a].y == tagp[i].y))
return i;
}
return 0;
}
int main()
{
//freopen("d.txt","r",stdin);
int n,m,i,a,len;
char s[2];
int t,bpos,cpos;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
scanf("%d%d",&nb,&mb);
flag = 0;
memset(tagp,0,sizeof(tagp));
for (i = 1;i <= nb; ++i)
scanf("%d %d %s",&tagp[i].x,&tagp[i].y,tagp[i].mark);
while (mb--)
{
scanf("%d%s%d",&a,s,&len);
if (!flag)
{
if (tagp[a].mark[0] == 'N')
{
if (s[0] == 'L')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'W';
else if (len == 2)
tagp[a].mark[0] = 'S';
else if (len == 3)
tagp[a].mark[0] = 'E';
}
if (s[0] == 'R')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'E';
else if (len == 2)
tagp[a].mark[0] = 'S';
else if (len == 3)
tagp[a].mark[0] = 'W';
}
if (s[0] == 'F')
{
for (i = 0; i < len; ++i)
{
tagp[a].y++;
if (tagp[a].y > m)
{
cpos = a;
flag = 1;break;
}
bpos = iscrash(a);
if (bpos)
{
flag = 2;
cpos = a;
break;
}
}
}
}
else if (tagp[a].mark[0] == 'S')
{
if (s[0] == 'L')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'E';
else if (len == 2)
tagp[a].mark[0] = 'N';
else if (len == 3)
tagp[a].mark[0] = 'W';
}
if (s[0] == 'R')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'W';
else if (len == 2)
tagp[a].mark[0] = 'N';
else if (len == 3)
tagp[a].mark[0] = 'E';
}
if (s[0] == 'F')
{
for (i = 0; i < len; ++i)
{
tagp[a].y--;
if (tagp[a].y <= 0)
{
cpos = a;
flag = 1;break;
}
bpos = iscrash(a);
if (bpos)
{
flag = 2;
cpos = a;
break;
}
}
}
}
else if (tagp[a].mark[0] == 'W')
{
if (s[0] == 'L')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'S';
else if (len == 2)
tagp[a].mark[0] = 'E';
else if (len == 3)
tagp[a].mark[0] = 'N';
}
if (s[0] == 'R')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'N';
else if (len == 2)
tagp[a].mark[0] = 'E';
else if (len == 3)
tagp[a].mark[0] = 'S';
}
if (s[0] == 'F')
{
for (i = 0; i < len; ++i)
{
tagp[a].x--;
if (tagp[a].x <= 0)
{
cpos = a;
flag = 1;break;
}
bpos = iscrash(a);
if (bpos)
{
flag = 2;
cpos = a;
break;
}
}
}
}
else if (tagp[a].mark[0] == 'E')
{
if (s[0] == 'L')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'N';
else if (len == 2)
tagp[a].mark[0] = 'W';
else if (len == 3)
tagp[a].mark[0] = 'S';
}
if (s[0] == 'R')
{
len = len%4;
if (len == 1)
tagp[a].mark[0] = 'S';
else if (len == 2)
tagp[a].mark[0] = 'W';
else if (len == 3)
tagp[a].mark[0] = 'N';
}
if (s[0] == 'F')
{
for (i = 0; i < len; ++i)
{
tagp[a].x++;
if (tagp[a].x > n)
{
cpos = a;
flag = 1;break;
}
bpos = iscrash(a);
if (bpos)
{
flag = 2;
cpos = a;
break;
}
}

}
}
}
}
if (!flag) printf("OK\n");
else if (flag == 1) printf("Robot %d crashes into the wall\n",cpos);
else if (flag == 2) printf("Robot %d crashes into robot %d\n",cpos,bpos);
}
return 0;
}


 

转载于:https://www.cnblogs.com/E-star/archive/2012/02/25/2368161.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值