codeforce 606B Testing Robots

题意:给定一个x*y的矩形,和一个机器人的初始位置(x0,y0)。以向下为x轴正方向,向右为y轴正方向。现在要对这个机器人进行多次测试。每次测 试,会在矩形的某个位置有一个矿井。所以一共要进行x*y次测试,每次测试,矿井会出现在一个之前的测试没有出现过的地方,而机器人的初始位置保持不变 (即为(x0,y0))。

每次测试,机器人会沿一个给定的字符串走,字符串只可能包括'L', 'R', 'U', 'D',分别代表向左,向右,向上,向下。当然,如果机器人不能沿所给的方向走(就是走到了边缘),机器人会呆在原地一次。每次测试,机器人都按这个给定的字符串走。当机器人走到和矿井所在的位置重合时,机器人会爆炸,当机器人恰好走完这个字符串之后,机器人也会爆炸。

现在想知道,机器人在走了第k步后(0<=k<=n,其中n为字符串的长度),有多少种测试情况会使机器人在恰好走了k步之后就爆炸了?

思路:模拟一下,区分先前走过与没有走过。

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<memory.h>
 5 #include<string.h>
 6 #include<algorithm>
 7 #include<cmath>
 8 const int N = 30;
 9 const int inf=-100000;
10 using namespace std;
11 
12 int g[510][510];
13 int num;
14 int X,Y,X0,Y0,xx,yy;
15 int fun(char c)
16 {
17     int flag=0;
18     switch(c)
19     {
20     case'R':
21         if(yy<Y)
22             yy++;
23             break;
24     case'L':
25         if(yy>1)
26             yy--;
27             break;
28     case'U':
29         if(xx>1)
30             xx--;
31             break;
32     case'D':
33         if(xx<X)
34         xx++;
35         break;
36     }
37     if(g[xx][yy]==0)
38     {
39         flag=1;
40         num--;
41     }
42     g[xx][yy]=1;
43     return flag;
44 }
45 int main()
46 {
47     //int x,y,x0,y0;
48     char str[100010];
49     scanf("%d%d%d%d",&X,&Y,&X0,&Y0);
50     scanf("%s",str);
51     memset(g,0,sizeof(g));
52     num=X*Y;
53     num--;
54     xx=X0,yy=Y0;
55     g[X0][Y0]=1;
56     cout<<"1 ";
57     for(int i=0;i<strlen(str)-1;i++)
58     {
59         cout<<fun(str[i])<<" ";
60     }
61     if(fun(str[strlen(str)-1]))
62     {
63         num++;
64         cout<<num<<endl;
65     }
66     else
67     {
68         cout<<num<<endl;
69     }
70     return 0;
71 }
View Code

 

转载于:https://www.cnblogs.com/ITUPC/p/5040170.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值